随机 cron 命令

随机 cron 命令

我想编写一个 cron 命令来执行一项任务一次在一周中的某个随机时间 - 如果不让 crontab 自行修改,这可能吗?我考虑过编写一个基于随机数生成器的函数,该函数可能会执行也可能不会执行任务 - 但我希望命令一定会执行,并且一周中不会有哪一秒比其他任何一秒更有可能执行...

答案1

一个快速的解决方案是编写一个 cron 脚本,每周调用一次,并在执行实际工作之前延迟一段随机时间(不超过一周),例如使用以下命令(适用于 bash 和 zsh)

sleep $(($RANDOM/32768.*60*24*7))m

答案2

cron使用和的组合at。你的 crontabbed 脚本将包含类似以下内容:

TIME=$(($RANDOM/32768.*60*24*7))m
at -f /usr/local/bin/scriptfile $TIME

输入/usr/local/bin/scriptfile您想要运行的命令。

答案3

一个快速(且肮脏、糟糕,见下面的评论)的解决这个问题的方法是创建一个 bash 脚本,该脚本将作为 cron 每天运行,设计如下:

该 shell 脚本每天有 1/7 的机会运行您的命令,并且每次成功运行时都会更新文件的时间戳(为此使用“touch”)。
您只需检查文件是否已超过 7 天,即可决定是否提前运行脚本(此处“find”可以完成这项工作)。

一定有更好的方法,但我太累了,看不到它^^

更新:正如 Joe 指出的那样,这个脚本有一个很大的缺陷,就是它在某些星期可能(并且最终)根本无法运行。因此你不应该使用它,但我将把它作为一个反例。

答案4

我编写了一个小脚本weekrand(在网上某处查找建议,忘记在哪里了),它的作用就是:

#!/bin/bash

FLOOR=1
RANGE=10080 # number of minutes per week

number=0   #initialize
while [ "$number" -le $FLOOR ]
do
  number=$RANDOM
  let "number %= $RANGE"  # Scales $number down within $RANGE.
done

sleep ${number}m
$@

因此基本上会在0 到 10080 分钟之间weekrand {some command} {parameters}随机执行,即一周内。{some command}{parameters}

crontab使用它的示例行:

 0  0    1   *   *      nice -n 10 /usr/local/bin/weekrand /root/jobs/weekly_job

相关内容