我的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, 诺尔
答案 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/