如何防止cron踩踏?


13

假设我有几个cron脚本,需要每15分钟运行一次。我可以将它们设置为run:,*/15 * * * *但是随后它们都同时运行。服务器闲置几分钟,然后突然尝试同时执行十二个脚本,这似乎很愚蠢。

有什么办法可以让我在第1、16、31、46分钟运行一个脚本,而在第2、17、32、47分钟运行另一个脚本?

换句话说,我希望每个脚本每15分钟运行一次,但是我不在乎它们是否专门在每25分钟运行一次。

Answers:


7

您正在使它变得比所需的更难。将它们全部放在同一行,并用分号隔开:

*/15 * * * * command1 ; command 2 ; command 3

它将运行command1,等待它完成,然后运行command2,等待它完成,依此类推。


15

如果使您的Cron工作看起来像这样:6-59/15 * * * *那么它将在每小时的6、21、36和51分钟运行一次。

这可能不适用于所有版本的cron。


14

您可以将所有脚本放入目录中,例如/etc/cron.15m,然后运行cron

*/15 * * * * run-parts /etc/cron.15m

假设您有run-parts命令。它至少存在于所有基于Debian的系统上。它以指定的顺序一次运行命名目录中的所有可执行程序。

此方法的缺点是,如果其中一个脚本挂起,则其余所有脚本将等待而不执行。如果所有这些程序的运行时间都超过15分钟,则作业将再次开始运行,并且您可能会堆积很多进程。


run-parts在Fedora / Red Hat系统中也存在。
mattdm

9

最简单的方法是手动设置要在需要时运行的命令:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

或者,您可以编写脚本来自动生成适当的crontab条目(避免输入错误)。

cron的某些版本(可能包括您使用的版本)接受扩展的语法:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14

0

Cron并不是真的擅长于您要做什么。您是否考虑过编写充当守护程序的脚本,该脚本基本上休眠15分钟,执行命令,然后循环执行?


1
这样做有两个潜在的问题。一种是,如果您sleep 300在每次执行命令之间进行操作,则命令本身的执行将导致时间漂移。它可能每15:10而不是每15:00运行一次。而且,与不同crond,如果后台进程终止或系统重新启动,它将不会自动重新启动。有一些方法可以“后台化”后台进程,但是随后您将大量重新实现crond
基思·汤普森

是的,我同意这不是一个完美的解决方案(尽管您始终可以使用&后台执行任务),但是您可以使用了。
马特·西蒙斯

1
而是让cron运行一个脚本,该脚本依次执行所有命令。实际上,这是非常普遍的需求,run-parts大多数cron安装附带一个标准脚本,专门用于执行此操作。参见@AndrewSchulman的答案。
tylerl

0

许多发行版都有/etc/cron.d/cronhourly,每个版本中的所有脚本都每小时运行一次。您甚至可以通过以序号开头的顺序来指定顺序,例如lik 01scriptA 02scriptB-它对您已经具有制造“ cronhourlybyfour”的cron知识应该是微不足道的,因为我们在Smoothwall的Linux发行版库上称它为:)

警告词:如前所述,它使用运行部件,运行部件不喜欢带有的脚本。在名称中,因此不要将其命名为“ deletehomefolders.sh”,而是将其命名为“ 01deletehomefolders”,并确保您以正确的#开头!您打算解释脚本的行。

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.