上一次运行未完成时,如何阻止cron作业? 它是一个每5分钟运行一次的cron作业,但有时需要超过5分钟才能运行。
编辑被调用的脚本,有时会崩溃! 所以它不能删除locking文件。
使用Flock(1):
NAME flock - manage locks from shell scripts SYNOPSIS flock [options] <file> -c <command> flock [options] <directory> -c <command> flock [options] <file descriptor number> [...]
你可以阻止或立即退出。 锁文件的存在没有什么区别 – 它使用flock()系统调用来locking文件,该文件在进程死亡时自动释放。
注意,如果你的脚本是一个shell脚本,你可以使用一些聪明的redirect技巧来在脚本本身中使用flock。 看手册页。
Pid文件是要走的路,但是,像init脚本不只是放弃,当他们看到一个PID文件,你应该检查,以确保文件中的PID仍然存在。
像这样的事情会做的伎俩:
PIDFILE=/var/run/myscript.pid if [ -e "$PIDFILE" ] ; then # our pidfile exists, let's make sure the process is still running though PID=`/bin/cat "$PIDFILE"` if /bin/kill -0 "$PID" > /dev/null 2>&1 ; then # indeed it is, i'm outta here! /bin/echo 'The script is still running, forget it!' exit 0 fi fi # create or update the pidfile /bin/echo "$$" > $PIDFILE ... do stuff ... /bin/rm -f "$PIDFILE"
当cron作业在退出后无法清理文件时,检查pid或lock文件可能会失败。 我看到更好的select是检查过程本身,如:
ps -ef | grep script_name | grep -v grep | wc -l
这将为您提供名称为“script_name”的进程数量。 您可以在脚本执行开始时检查这个计数。
你不能,cronjobs不具备这个function。 在你的脚本中join一些东西来检查它,或者在完成时创build一个文件,并使用诸如inotifywait的东西来阻止。
在/var/run查找一个文件。 如果find该文件,则退出。 否则,创build该文件,运行您的例程,然后删除该文件。
有很多方法。 stream行的一个是使用locking文件。
1)当脚本启动时,它检查锁文件(如/var/lock/powtac.loc )是否已经出现。
2)如果确实存在,假定前面的脚本仍在运行*),脚本将中止。
3)如果它不存在,脚本创build文件并继续做它需要做的事情。
4)退出时,脚本删除locking文件。
*)也可以在此处检查进程列表,为您的cron作业search匹配项,如果find,请查看它们何时启动。 如果最近,那么假设他们还在跑步,如果时间久了,那么就假设他们被卡住了。
我不会有两个克伦的工作,我会有一个。
* * * * * /some/command && /some/other/command
它只会在第一个命令成功完成时才运行,并且只有在完成后才会运行。
(注意:如果你需要使用sleep后几分钟)