Cron作业生成重复的进程

时间:2013-08-19 08:18:38

标签: linux shell cron

我的cron如下:

$ crontab -l <​​/ strong>

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

$ more /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, 诺尔

3 个答案:

答案 0 :(得分:0)

您提供的输出似乎正常,前两个流程仅/bin/sh运行您的cron脚本,后两个流程是rsync流程。

如果crontab与您用于测试的用户不同,则可能是权限问题,导致脚本从cron运行时需要更长时间。您可以将-v-vv甚至-vvv添加到rsync命令以增加输出,然后在每次运行后观察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。如果在重新启动操作系统时脚本崩溃,被杀或正在运行,则可能会将锁保留在那里。

答案 1 :(得分:0)

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

肯定不是cron启动两个rsync进程。

答案 2 :(得分:0)

您可能希望查看Fat Controller

,而不是CRON

它与CRON类似,但有各种内置策略,用于管理您要运行的脚本实例重叠的情况。

例如,您可以指定当前正在运行的实例已被终止并且新的实例已启动,或者您可以指定一个宽限期,在该宽限期内当前运行的实例必须先完成,然后再终止它并启动一个新的实例。或者,您可以指定无限期等待。

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