隨機 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 天即可決定是否提前執行腳本(「尋找」可以完成此處的工作)。

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

更新:正如 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

相關內容