
我想寫一個 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