Answers:
如果我了解您要查找的内容,则需要做一些混乱的事情,例如执行cron作业以运行随机运行时间的bash脚本……
crontab:
0 9 * * * /path/to/bashscript
并在/ 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秒,随机分配秒也要复杂一点。最后,由于开始时间是随机的并且彼此独立,因此有可能(但不太可能)同时启动两个或更多脚本实例。
((maxdelay = 14 * 60))
或((delay = $RANDOM % maxdelay))
)。该sleep
参数仍然必须是您拥有该参数的方式(尽管您可以根据需要添加空格)。
sleep $[ ( $RANDOM % 60 ) + 1 ]s && some_script.sh
是的,这个问题已有一年多了,但也许我可以添加一些有用的内容:
如何在上午9点至晚上11点之间每天随机偏移20次?在cron中这有点棘手,因为您将14小时除以20执行时间。我不太喜欢其他答案,因为它们需要为您的PHP脚本编写bash包装器脚本。
但是,如果您允许我在8:30 am到11:09 pm之间将时间和频率限制放宽到13倍,则可能会成功,而且一切都在crontab的范围内:
30 8-21/* * * * sleep ${RANDOM:0:2}m ; /path/to/script.php
$ {RANDOM:3:2}使用其他人上面提到的bash的$ RANDOM,但是添加了bash数组切片。由于未对bash变量进行类型化,因此伪随机带符号的16位数字将被截断为5个十进制数字的前2个,这为您提供了简洁的单行代码,可将您的cronjob延迟10至99分钟(尽管分布偏向于10至32)。
以下内容也可能对您有用,但是由于某种原因,我发现它的确“不那么随机”(也许本福德定律是通过调制伪随机数触发的。嘿,我不知道,我数学不正确……怪它猛扑!):
30 8-21/* * * * sleep $[RANDOM\%90]m ; /path/to/script.php
您需要在上面将模数显示为'\%',因为cron(至少是Linux'vixie-cron')在遇到未转义的'%'时会终止该行。
也许您可以通过添加另一个具有7小时范围的行来获得其余7个脚本执行。或放宽您的限制,以在凌晨3点至晚上11点之间运行。
$[(RANDOM/368)+10]
呢?
$((RANDOM % 90 + 10))
测试:for i in {0..9999}; do echo $((RANDOM % 90 + 10)); done | sort | uniq -c
$RANDOM
:sleep $(( $(od -N1 -tuC -An /dev/urandom) \% 90 ))m
。
crontab
使用bash
前请确保正在使用$RANDOM
。如果有vixie-cron
(似乎是我在Ubuntu上的情况),则可以添加SHELL=/bin/bash
到顶部。这里还有其他cron版本的替代方案:superuser.com/a/264541/260350
crontab: errors in crontab file, can't install. Do you want to retry the same edit?
帮助
所以我正在使用以下命令在1AM和330AM之间运行命令
0 1 * * * perl -le 'sleep rand 9000' && *command goes here*
那一直在照顾我对我的随机需求。9000秒== 150分钟== 2.5小时
克龙提供了一个RANDOM_DELAY
变量。有关crontab(5)
详细信息,请参见。
RANDOM_DELAY变量允许通过变量指定的上限将作业启动延迟随机的分钟数。
这在anacron
工作中很常见,但在中也很有用crontab
。
如果您有一些作业以精细(分钟)的粒度运行,而另一些则是粗糙的,那么您可能需要对此小心。
RANDOM_DELAY
仅建立一次,并且在整个守护程序运行期间保持不变。
我的第一个想法是创建一个Cron作业,随机地发布20个作业。该at
实用程序(http://unixhelp.ed.ac.uk/CGI/man-cgi?at)用于在指定时间执行命令。
我最终使用了sleep $(( 1$(date +%N) % 60 )) ; dostuffs
(与bash&sh兼容)
1前缀用于强制对日期+%N进行NON base 8解释(例如00551454)
不要忘记在crontab文件中使用\%转义%
* * * * * nobody sleep $(( 1$(date +\%N) \% 60 )) ; dostuffs
date
(您可能在大多数Linux上都可以这样做,但在Busybox,标准MacOS或其他各种BSD衍生平台上却没有)。
at -f [file] [timespec]
要么
echo [command] | at [timespec]
要么
at [timespec]
...以及诸如script
的录音之类的交互式规范。
在运行时,文本在stdin或由指定的文件中提供-f [file]
。
这是[timespec]
语法。可能是这样的:
0100
,2359
,1620
now + 10 minutes
2071-05-31 - 5 hours 12 minutes UTC
如果您明确指定时区,则timespec的某些版本可能仅允许UTC
使用可选的时区参数。
cat script.sh | at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
您可以通过预先挂起echo
和转义|
(管道)来测试bash解析。
echo cat script.sh \| at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
echo at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
要查看计划的作业,请使用atq
和使用作业内容(环境变量,设置和命令/脚本)at -c [jobid]
。
该系统是cron的一部分,交互式提示实际上捕获了Shell的整个当前状态,因此您可以在不指定绝对路径的情况下运行命令。
对于那些在这里搜索过的人:
如果您正在使用anacron(Ubuntu台式机和笔记本电脑),则可以进行编辑
/etc/anacrontab
并添加
RANDOM_DELAY=XX
其中XX是您要延迟基本作业的分钟数。
Anacron就像cron一样,但是它不希望您的计算机运行在24x7上(例如我们的笔记本电脑),并且会运行由于系统关闭而丢失的脚本。
如何创建每天重写crontab的脚本呢?
我意识到这是一个较旧的线程,但是我想添加一个我经常使用的与随机值相关的东西。而不是使用固定范围和有限范围的$ RANDOM变量,我经常在shell中使用
dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none
例如,您可以这样做
FULLRANDOM=$(dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none)
并克服此线程中讨论的一些限制。
~$info dd
我无法正常工作,我可以了解左侧的情况|
,但无法确定右侧。因此,对于我和其他对overcoming some restrictions
随机值生成感兴趣的人,为什么不花一点时间来解释RHS,并为使用您的方法做一个更强的建议。深入的解释都使人们对您建议的过程及其好处感到满意。谢谢。