如何让cron免受踩踏?

假设我有几个需要每15分钟运行一次的cron脚本。 我可以设置他们运行: */15 * * * * ,但是他们都在同一时间运行。 服务器闲置几分钟似乎很愚蠢,然后突然尝试同时执行一打脚本。

有没有办法让我的脚本能在1分钟,16分钟,31分钟,46分钟以及2分钟,17分钟,32分钟,47分钟运行?

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

你正在做的比想要的要难。 把它们放在同一行,用分号隔开:

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

它将运行command1 ,等待它完成,然后运行command2 ,等待它完成,等等。

如果你让你的cron工作如下所示: 6-59/15 * * * *那么它将运行在每小时6,21,36和51分钟。

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

你可以把所有的脚本放到一个目录中,比如/etc/cron.15m ,然后运行cron

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

假设你有run-parts命令。 它至less在所有基于Debian的系统上都存在。 它按名称顺序一次一个地运行指定目录中的所有可执行程序。

这种方法的一个缺点是,如果其中一个脚本挂起,所有其余的将等待而不被执行。 如果所有人的运行时间超过15分钟,那么这个工作将再次开始运行,并且可能会导致大量进程堆积。

最直接的方法就是手动设置要运行的命令,以便:

 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 

Cron并不擅长你想做的事情。 你有没有考虑写一个脚本,作为守护进程,基本上睡15分钟,执行命令,然后循环?

许多发行版都有/etc/cron.d/cronhourly,为此get中的所有脚本每小时运行一次。 你甚至可以用连续的数字开始顺序来指定顺序,例如:01scriptA 02scriptB – 在cron知识中,你必须制作一个“cronhourlybyfour”,因为我们在Smoothwall的linux发行版基础上调用它。

警告字:这个使用了前面提到的run-parts,而run-parts不像脚本那样使用a。 在名称中,所以不要称之为“deletehomefolders.sh”称为“01deletehomefolders”,并确保您从右边开始#! 无论你打算如何解释你的脚本。