运行多个cron作业,其中一项作业需要很长时间


16

关于cron工作,我有以下一般性问题。

假设我的内容如下crontab

* 10 * * * * someScript.sh
* 11 * * * * someScript2.sh
30 11 */2 * * someScript3.sh  <-- Takes a long time let's say 36 hours.
* 12 * * * someScript4.sh

在适当的时候运行剩余的工作足够聪明吗?例如,长脚本不需要终止吗?

另外,如果最初的长脚本仍在运行并且再次被cron调用,会发生什么?

谢谢!


Cron不在乎作业要运行多长时间;它将运行其他副本。
杰夫·谢勒

请确保您的问题格式正确。
Bram 2015年

Answers:


31

每个cron作业的执行均独立于您可能指定的其他作业。这意味着您的长寿命脚本将不会阻止其他作业在指定时间执行。

如果您的任何脚本仍在下一个计划的cron间隔执行,则将执行另一个并发脚本实例。

这可能会导致无法预料的后果,具体取决于脚本的功能。我建议阅读有关文件锁定的Wikipedia文章,特别是有关锁定文件的部分。锁定文件是一种简单的机制,用于指示资源(在您的情况下为someScript3.sh脚本)当前处于“锁定”状态(即正在使用中),在删除锁定文件之前,不应再次执行该资源。

请查看以下问题的答案,以详细了解在脚本中实现锁定文件的方法:


8

不知道您的意思是适当的时间。Cron将在计划的时间开始工作。它不检查其他计划的作业或作业的其他实例。

因此,您定义的所有有效作业都将在定义的时间启动。运行时间超过定义间隔的任何作业将被多次启动。编写作业的人有责任防止该作业实际运行多次(如果需要)。通过例如检查锁定文件或PID文件等。

可以并行运行的进程数量有明显的限制,但这些不是cron特定的。


6

除了其他答案外,尤其是@soulcake发布的链接:如果您安排了间隔太短的长时间运行的命令,cron将在第一个命令完成之前愉快地执行第二个命令(除非命令中实现了某种互斥体) 。

这通常会进一步降低原始命令的速度,导致另一个实例在之前的实例完成之前运行,等等。或者由于其他原因,这可能是不可取的。

防止这种情况的一般方法是在运行该命令的条件下使用防护措施,以确保先前的命令没有在运行。例如:

10 * * * * pgrep my_slow_command >/dev/null || /usr/local/bin/my_slow_command

确保pgrep运行时与命令的名称匹配,例如python脚本将python作为可执行文件的名称,这可能不够具体,并且您还必须与python的脚本名称匹配。

10 * * * * pgrep -f my_script.py || /usr/local/bin/my_script.py

(但是,不带-f选项的pgrep与bash脚本名称匹配)

如果由于某种原因而无法使用pgrep:

10 * * * * ps ax | grep [m]y_command || /usr/local/bin/my_command

方括号用于避免与grep命令本身匹配。


0

我用flock

* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.