不定期安排作业

Cha*_*les 5 cron scheduling at

使用它cron来安排作业定期发生非常简单。我希望某些事情不那么频繁地发生——比如说,运行作业,然后等待 2 到 12 个小时,然后再试一次。(任何合理类型的随机性都可以在这里工作。)有没有好的方法可以做到这一点?

jhi*_*mer 10

您可以使用命令“at”

at now +4 hours -f commandfile
Run Code Online (Sandbox Code Playgroud)

或者

at now +$((($RANDOM % 10)+2)) hours -f commandfile
Run Code Online (Sandbox Code Playgroud)


der*_*ert 6

选项1

安排您在 cron 中的工作每小时(或每隔一小时)运行一次,但在工作前添加类似这样的内容(假设您SHELL=/bin/bash的 crontab 中有):

[ $[RANDOM % 12] -eq 0 ] || exit 0; YOUR_JOB_HERE
Run Code Online (Sandbox Code Playgroud)

然后,每次预定的作业运行的几率大约为十二分之一。

选项 2

安排一个 cron 作业,在一天开始时,计算出一些随机时间并用于at安排今天的所有运行。这要复杂得多,但允许您使用不同的随机分布。例如,您可能希望 2 小时比 12 小时更有可能。


印刷精美

*这种产生随机数的方法实际上是有偏差的。问题是最大值 (32767) 不是 12(减 1)的偶数倍。要清楚地看到问题,请比较最大值是否为 11 (12×1-1 = 11)。0 将产生 0,1 将产生 1,等等。一直到 11 产生 11。但如果是 13,则 12 产生 0,13 产生 1。所以 0 和 1 有两个产生它们的值,但是 2– 11 只有一个值,所以他们不太可能。因此,它是有偏见的。切换到使用除以最大值的公式并不能解决问题,它只是改变了偏向于哪些数字。实际的修复是更多的代码(并且基本上涉及通过在不是时再次尝试来伪造您需要的最大值)。