它非常简单,可以用来cron
安排定期发生的作业。我希望某些事情发生得不那么频繁 - 例如,运行作业,然后等待 2 到 12 小时再重试。 (任何合理类型的随机性都可以在这里工作。)有没有好的方法可以做到这一点?
答案1
您可以使用命令“at”
at now +4 hours -f commandfile
或者
at now +$((($RANDOM % 10)+2)) hours -f commandfile
答案2
选项1
在 cron 中安排您的作业每小时(或每隔一小时)运行一次,但在作业前面加上类似这样的前缀(假设您SHELL=/bin/bash
的 crontab 中有):
[ $[RANDOM % 12] -eq 0 ] || exit 0; YOUR_JOB_HERE
那么,作业每次按计划运行的机会大约是*十二分之一。
选项2
安排一个 cron 作业,在一天开始时计算出一些随机时间并用于at
安排今天的所有运行。这要复杂得多,但允许您使用不同的随机分布。例如,您可能希望 2 小时比 12 小时更有可能。
印刷精美
*这种生成随机数的方法实际上是有偏差的。问题是最大值 (32767) 不是 12 的偶数倍(减一)。为了清楚地看到问题,请比较最大值是否为 11 (12×1-1 = 11)。 0 将产生 0,1 将产生 1,等等,一直到 11 产生 11。但如果是 13,则 12 产生 0,13 产生 1。所以 0 和 1 有二产生它们的值,但 2-11 只有一个值,因此它们的可能性较小。因此,它是有偏见的。切换到使用除以最大值的公式并不能解决问题,它只是改变了有偏差的数字。实际的修复需要更多的代码(并且基本上涉及通过在不需要时再次尝试来伪造最大值)。