克朗工作和随机时间,在给定的小时内

我需要能够完全随机的时间每天运行一次PHP脚本20次。 我也希望它只能在上午9点到晚上11点之间运行。

我熟悉在linux中创buildcron作业。

如果我明白你在找什么东西,那么你需要做一些有点混乱的事情,比如有一个运行bash脚本的cron作业,这个bash脚本可以随机化运行时间。例如:

crontab中:

0 9 * * * /path/to/bashscript 

和in / path / to / bashscript:

 #!/bin/bash maxdelay=$((14*60)) # 14 hours from 9am to 11pm, converted to minutes for ((i=1; i<=20; i++)); do delay=$(($RANDOM%maxdelay)) # pick an independent random delay for each of the 20 runs (sleep $((delay*60)); /path/to/phpscript.php) & # background a subshell to wait, then run the php script done 

一些注意事项:这种方法有点浪费资源,因为它在上午9点启动了20个后台进程,每个进程在随机的几分钟(最多14个小时,即下午11点)左右等待,然后启动php脚本退出。 另外,由于它使用随机数分钟(而不是秒),所以开始时间并不像它们可能的那样是随机的。 但$ RANDOM只能达到32,767,而在上午9点到晚上11点之间有50,400秒,随机化秒数也会稍微复杂一些。 最后,由于开始时间是随机的并且彼此独立,所以可能(但不太可能)脚本的两个或更多个实例将同时开始。

是的,是的,这个问题已经过了一年多了,但也许我可以添加一些有用的东西:

如何在上午9点到晚上11点之间随机偏移20次? 在cron中这是一个棘手的问题,因为你将执行时间除以14个小时。 我不喜欢其他的答案,因为他们需要为你的php脚本编写一个bash包装脚本。

但是,如果你允许我在8:30到11:09之间自由地将时间和频率限制减less到13倍,那么这可能会起到一些作用,而且在你的crontab范围内:

 30 8-21/* * * * sleep ${RANDOM:0:2}m ; /path/to/script.php 

$ {RANDOM:3:2}使用其他人在上面提到的bash的$ RANDOM,但增加了bash数组切片。 由于bashvariables是无types的,伪随机有符号的16位数被截断到5个小数位的前2位,给你一个简洁的单行命令,用于延迟10到99分钟之间的cronjob(尽pipe分布偏向10至32)。

下面也可能适用于你,但是我发现它由于某种原因是“不太随机的”(也许本福德定律是通过调制伪随机数来触发的)。嘿,我不知道,我算不算math了。在bash!):

 30 8-21/* * * * sleep $[RANDOM\%90]m ; /path/to/script.php 

因为cron(至lessLinux'vixie-cron')在遇到未转义的'%'时终止行,所以需要将模数表示为'\%'。

也许你可以通过在另一个7小时范围内添加另一行来获得剩余的7个脚本执行。 或者放松你的限制,在凌晨三点到十一点之间运行。

所以我使用以下命令在1AM和330AM之间运行命令

 0 1 * * * perl -le 'sleep rand 9000' && *command goes here* 

这一直在照顾我的随机需求。 这是9000秒== 150分钟== 2.5小时

Cron提供了一个RANDOM_DELAYvariables。 有关详细信息,请参阅crontab(5)

RANDOM_DELAYvariables允许以variables指定的上限随机分钟数延迟作业启动。

这在anacron作业中很常见,但在crontab也可以使用。

如果您有一些工作在精细(微小)粒度和其他粗糙的工作,您可能需要小心。

我的第一个想法是创build一个cron工作,启动20个随机排定的工作。 at实用程序(http://unixhelp.ed.ac.uk/CGI/man-cgi?at)用于在指定的时间执行命令。;

我结束了sleep $(( 1$(date +%N) % 60 )) ; dostuffs sleep $(( 1$(date +%N) % 60 )) ; dostuffs (兼容bash&sh)

1前缀是强制NON base 8解释date +%N(例如00551454)

不要忘记在crontab文件中使用\%转义%

* * * * * nobody sleep $(( 1$(date +\%N) \% 60 )) ; dostuffs