
ジョブが実行されるようにcronコマンドを書きたいのですが一度週のランダムな時間に - crontab 自体を変更せずにこれを実行することは可能ですか? 乱数ジェネレータに基づいて、タスクを実行するかどうかを決定する関数を作成することを検討しましたが、コマンドを確実に実行し、週の中で他のどの秒よりも可能性が高い秒がないようにしたいのです...
答え1
簡単な解決策としては、週に一度呼び出され、実際の作業を行う前にランダムな時間(1週間以内)だけ遅延する cron スクリプトを作成することです。たとえば、次のコマンドを使用します(bash および zsh で動作します)。
sleep $(($RANDOM/32768.*60*24*7))m
答え2
cron
との組み合わせを使用しますat
。crontab スクリプトには次のような内容が含まれます。
TIME=$(($RANDOM/32768.*60*24*7))m
at -f /usr/local/bin/scriptfile $TIME
/usr/local/bin/scriptfile
実行したいコマンドがあります。
答え3
この問題に対する簡単な(そして汚い、そして悪い、以下のコメントを参照)解決策は、cron として毎日実行され、次のように設計された bash スクリプトを作成することです。
このシェル スクリプトは、毎日 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 分の間、つまり 1 週間以内にランダムにweekrand {some command} {parameters}
実行されます。{some command}
{parameters}
これを使用した例のcrontab
行:
0 0 1 * * nice -n 10 /usr/local/bin/weekrand /root/jobs/weekly_job