每隔一小时随机运行一个cron作业

4

我想要一个随机每小时运行一次的cronjob。(即,如果第一个任务在58分钟运行,则第二个任务应该在47分钟运行,第三个任务在52分钟运行,以此类推)。但这应该随机运行每小时。有没有办法做到这一点?


1
Cron本身无法做到这一点。您必须采用解决方法。您可以每分钟运行一个脚本,并随机决定是否应该运行。每天在一个文件中保留已经运行的小时列表,仅当当前小时不在其中时才运行。 - renefritze
或者在cron上每小时运行一个脚本,然后等待少于60分钟的随机时间才执行任何操作。或者,在cron上每小时整点运行,但在cron内部,在运行脚本之前进行少于60分钟的随机休眠。 - Mark Setchell
1
所以也许可以这样写:0 * * * * perl -e 'sleep int rand 3600' && yourScript - Mark Setchell
我可以知道这里的perl -e是做什么用的吗? - Harnish
perl -e '...' 执行单引号中的代码作为 Perl 程序。该程序会休眠少于 3,600 秒的随机秒数。当程序完成休眠后,将调用您的脚本。 - Mark Setchell
2个回答

6

不用使用perl或甚至php,只需使用BASH $RANDOM内置除以3600的方式,即可得到一个小时。

0 * * * * sleep $((RANDOM%3600)) && /path/to/yourScript

请记住,如果脚本睡眠时间随机接近一个小时,取决于脚本执行的时间,您可能会遇到一些竞争条件。


1
通常情况下,cronjob 使用 sh 而非 bash 运行,因此您需要在顶部添加 SHELL=/bin/bash - dawez

6

您可以每小时在整点运行作业,让它休眠3,599秒,然后执行您的脚本:

0 * * * * /path/to/perl -e 'sleep int rand 3600' && /path/to/yourScript

或者,如果你更喜欢使用PHP而不是Perl

0 * * * * /path/to/php -r 'sleep(rand(0,3599));' && /path/to/yourScript

您可以使用以下方法找到 Perl 的路径:

which perl

同样适用于PHP
which php

如果您的环境是合理的,除非您特别想使用自定义安装版本,否则您不需要完整路径到Perl。我猜这在PHP中更为常见。 - tripleee
1
@triplee同意!我看到很多cron问题因为缺少路径而失败... - Mark Setchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接