3

我的 cron 如下:

$ crontab -l

0,15,30,45 * * * * /vas/app/check_cron/cronjob.sh 2>&1 > /vas/app/check_cron/cronjob.log; echo "Exit code: $?" >> /vas/app/check_cron/cronjob.log

$ 更多 /vas/app/check_cron/cronjob.sh

#!/bin/sh

echo "starting script";

/usr/local/bin/rsync -r /vas/app/check_cron/cron1/ /vas/app/check_cron/cron2/

echo "completed running the script";

$ ls -l /usr/local/bin/rsync

-rwxr-xr-x   1 bin      bin       411494 Oct  5  2011 /usr/local/bin/rsync

$ ls -l /vas/app/check_cron/cronjob.sh

-rwxr-xr-x   1 vas     vas         153 May 14 12:28 /vas/app/check_cron/cronjob.sh

如果我手动运行它...脚本运行良好。

$ /vas/app/check_cron/cronjob.sh 2>&1 > /vas/app/check_cron/cronjob.log; echo "Exit code: $?" >> /vas/app/check_cron/cronjob.log

如果由 crontab 运行,cron 会在 24 小时内生成超过 30 个双进程,直到我手动杀死它们。

$ ps -ef | grep cron | grep -v root | grep -v grep

vas 24157 24149   0 14:30:00 ?           0:00 /bin/sh /vas/app/check_cron/cronjob.sh
vas 24149  8579   0 14:30:00 ?           0:00 sh -c /vas/app/check_cron/cronjob.sh 2>&1 > /vas/app/check_cron/cronjob.log; ec
vas 24178 24166   0 14:30:00 ?           0:00 /usr/local/bin/rsync -r /vas/app/check_cron/cron1/ /vas/app/check_cron/cron2/
vas 24166 24157   0 14:30:00 ?           0:01 /usr/local/bin/rsync -r /vas/app/check_cron/cron1/ /vas/app/check_cron/cron2/

请给我建议如何使系统运行良好并且系统中没有仍在运行的进程并且进程正常停止。

BR,诺埃尔

4

3 回答 3

0

您提供的输出看起来很正常,前两个进程只是在/bin/sh运行您的cron脚本,后两个是rsync进程。

如果 crontab 与您用于测试的用户不同,这可能是权限问题,导致脚本从cron. 您可以在命令中添加-v-vv或什-vvvrsync以增加输出,然后cron在每次运行后观察电子邮件。

防止多个脚本运行实例的一种方法是使用某种锁定文件,我发现它很容易mkdir用于此目的。

#!/bin/sh

LOCK="/tmp/$0.lock"

# If mkdir fails then the lock already exists
mkdir $LOCK > /dev/null 2>&1
[ $? -ne 0 ] && exit 0
# We clean up the lock when the script exists for any reason
trap "{ rmdir $LOCK ; exit 0 ; }" EXIT

echo "starting script";

/usr/local/bin/rsync -r /vas/app/check_cron/cron1/ /vas/app/check_cron/cron2/

echo "completed running the script";

只需确保在操作系统启动时进行某种清理,以防它无法自行清理 /tmp。如果脚本崩溃、被杀死或在操作系统重新启动时正在运行,则锁定可能会保留在那里。

于 2013-08-19T13:21:58.260 回答
0

你为什么担心?有什么不工作吗?从父进程 ID 中,我可以推断出 shell(PID=24157)分叉了一个 rsync(24166),而 rsync 分叉了另一个 rsync(24178)。看起来这就是 rsync 的运作方式......

当然不是 cron 启动两个 rsync 进程。

于 2013-08-19T14:04:20.883 回答
0

而不是 CRON,你可能想看看Fat Controller

它的工作方式与 CRON 类似,但具有各种内置策略来管理要运行的脚本实例重叠的情况。

例如,您可以指定当前正在运行的实例被终止并启动一个新实例,或者您可以指定一个宽限期,在此期间当前正在运行的实例必须在终止它并启动一个新实例之前完成。或者,您可以指定无限期等待。

网站上有更多示例和完整文档:http: //fat-controller.sourceforge.net/

于 2013-08-19T15:57:38.523 回答