Cron 作业,随机启动但在时间范围内

Cron 作业,随机启动但在时间范围内

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

答案1

我从未见过有一种方法可以在随机时间运行作业的 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

答案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)

答案3

在 OpenBSD 上,从版本 6.7 开始(在 2020 年 4 月 15 日左右的快照中),您可以~在 crontab 文件中指定随机时间间隔:

使用~ 字段中的字符可以得到一个随机值(在合法范围内)。随机值的间隔可以明确指定,例如0~30将产生0到30之间的随机值(包括0和30)。如果省略两侧的一个(或两个)数字~,则将使用该字段的适当限制(低或高)。

30~45 * * * * somecommand

somecommand因此,将在每小时半点和下一小时一刻之间的 15 分钟间隔中的某个时间点执行。

由于使用了~picka单身的,但是给定范围内的随机值,一个 crontab 条目,例如

~ 9~11 * * * somecommand

将在每天上午 9:00 到中午(上午 11:59)之间的某个时间按照问题中的要求运行命令。

也可以看看

警告(手册中未提及):随机时间是随机选择的,但它们是固定的直到重新加载 crontab,即直到 cron 守护程序重新启动或使用 编辑 crontab 为止crontab -e。因此,这不会为您每次运行作业提供新的随机值,就像使用sleepwith$RANDOM那样。

答案4

这些答案中的大多数都依赖于不可移植的功能或 bashisms - 因为您已经要求破折号,所以这里有一个可移植的解决方案:

0 9 * * * sleep $(echo | awk '{srand(); print rand()*3600*3}') && whatever_you_wanted_to_do

这仅使用保证在 POSIX 下存在的实用程序和语法,并且应该可以在任何 UNIX 上工作,即使是最少的最小安装。

相关内容