我想知道如果我们在 crontab 中添加一个作业,例如每 5 分钟运行一次,而该作业实际上并没有在 5 分钟内完成,那么 cron 守护进程是否知道前一个实例已经在运行并跳过下一个运行?或者我是否必须以某种方式将逻辑构建到流程中?如何?
答案1
不,与 cron 的约定是它在指定时间启动每个作业。 Cron 不会跟踪哪些连续作业是“同一作业”。
如果您想避免在前一项工作尚未完成时开始一项工作,则需要在工作开始时放置一些内容以使其提前退出。例如,您可以安排作业保存锁定文件,如果无法打开锁定文件则退出。
* * * * flock -n /var/lock/myjob.lock /path/to/script
答案2
不,不是的。
您可以做的就是设置 cron 来运行包含您的作业的脚本,并将其设置为运行特定的时间。在每个时间间隔之前,从该脚本中终止/终止该作业,并让 cron 在下一个时间间隔时再次重新启动它。
答案3
https://www.timkay.com/solo/solo
...这可以防止程序一次运行多个副本。使用 cron 可以确保前一个作业完成之前作业不会运行。 (文档:https://www.timkay.com/solo/)
例子
* * * * * solo -port=3801 ./jobA.sh blah blah
当jobA.sh时间超过1分钟时,cron会再次调用solo,但由于3801端口已被使用,solo会返回错误,并且不会执行jobA.sh。