如何防止 cron 被踩踏?

But*_*840 13 cron

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

有没有办法让一个脚本在 1、16、31、46 分钟运行,另一个在 2、17、32、47 分钟运行?

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

Lad*_*ada 15

如果你让你的 cron 工作看起来像这样:6-59/15 * * * *那么它会在一个小时后的 6、21、36 和 51 分钟运行。

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


And*_*man 14

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

*/15 * * * * run-parts /etc/cron.15m
Run Code Online (Sandbox Code Playgroud)

那是假设你有run-parts命令。它至少存在于所有基于 Debian 的系统上。它运行指定目录中的所有可执行程序,按列表顺序一次一个。

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


Kei*_*son 9

最直接的方法是手动设置要在您希望它们运行时运行的命令:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14
Run Code Online (Sandbox Code Playgroud)

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

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

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14
Run Code Online (Sandbox Code Playgroud)


lae*_*ade 7

你让这变得比它需要的更难。把它们都放在同一行,用分号隔开:

*/15 * * * * command1 ; command 2 ; command 3
Run Code Online (Sandbox Code Playgroud)

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