Cron工作,随机开始,但在时间范围内


12

我希望脚本每天从0900到1200之间的任何时间每天运行一次。
我不确定破折号语法是不是意味着该脚本将在每个小时之间运行一次9-12,或者该脚本将在两个时间之间随机运行9-12?因为我需要后者。

Answers:


8

我从未见过cron实现可以在随机时间运行作业的方法。这是一个奇怪的要求。如文档所述,9-12是的快捷方式9,10,11,12,表示每小时9到12。

如果要随机运行作业,请在间隔开始时运行作业,然后添加随机延迟。例如,要在9到12之间的随机时间运行:

SHELL=/bin/bash
0 9 * * * sleep $((3600 * (RANDOM % 4))); do_stuff

请注意,这RANDOM需要bash或ksh,它在默认Shell中可能不可用。

如果要在9到12之间的任意时间以第二个分辨率运行,则可以将其RANDOM % 10800用作延迟,但是因为RANDOM它的范围是0..32767,所以延迟在0到32768之间会有偏差。10800 = 368.为避免这种偏见:

SHELL=/bin/bash
0 9 * * * max=$((32768/10800*10800)); while delay=$RANDOM; ((delay > max)); do :; done; sleep $((delay % 10800)); do_stuff

5
“这是一个奇怪的要求。” 我不同意。许多应用程序,尤其是那些需要定期与服务器签入的应用程序(例如,程序包管理器或配置管理客户端),需要延长其执行时间,以免出现群发雷电的情况。实际上,许多此类应用程序都内置了splay选项(例如--randomwait,yum的自--splay变量或Chef-client的自变量),但对于没有此选项的应用程序,随机执行时间将是作业调度程序中的有用功能。
jayhendren '16


2

我最终对python脚本有类似的要求,但最终通过脚本本身,使用随机+睡眠函数来实现此要求,然后在午夜启动cron作业

from time import sleep
import random

sleep_time = random.randint(0,7200)  #7200 seconds = 2 hours * 60 min * 60 sec
print(sleep_time)
sleep(sleep_time)

这是Linux发行版中的常见脚本通常随机分配开始时间的方法:先固定时间,然后在开始时睡眠。
Ned64
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.