3週間ごとに水曜日(午前8時)にのみクローンジョブを実行するようにスケジュールできますか?または、これが不可能な場合は、27日以下の間隔でジョブを実行しますが、水曜日の午前8時に実行してください。
答え1
毎週水曜日に次のコードを実行します。
tspath="/path/to/timestamp" && [ -f ${tspath} ] && \
[ `date +%s` -lt $(($(cat ${tspath})+20*86400)) ] || \
{ date +%s > ${tspath}; your_command; }
ここで/path/to/timestamp
は通常、ユーザーのホームディレクトリのどこかにある任意のパス名(最初は存在しません)です(シンボリックリンク攻撃を防ぐために他のユーザーが書き込むことができるディレクトリを使用しないでください)。コードは次のように動作します。
- このパス名がまだ存在しない場合は、現在の日付をコンテンツとして使用してパス名を作成し、コマンドを実行します。日付は、エポックと呼ばれるいくつかの起源の後に秒単位で表示されます。
- このパス名が存在する場合(この場合はこのスクリプトによって生成されたと仮定)、コマンドが最後に実行された日付を指定します。この日付に20日(20 * 86400秒)を加え、結果を現在の日付と比較します。少なくとも20日が経過した場合は、パス名の内容を現在の日付に更新してコマンドを実行します。
このコードは毎週水曜日(午前8時)cronを介して実行されるため、コマンドは3週間ごとに実行されます(1〜2週間後、まだ20日経過していません)。
この回避策は、3 番目の水曜日より前にコンピュータがシャットダウンしても動作し続けます。何らかの理由でマシンが3番目の水曜日に終了すると、マシンがオンになってから水曜日にコマンドが実行されます(質問では、コマンドは水曜日の午前8時にのみ実行される必要があります)。
編集する:上記のコードを独自のファイルに入れたり(スクリプトで実行)、crontabファイルの1行に直接置くことができます(この場合はバックスラッシュを削除)。
答え2
GNU/Linux と dillon を使用している場合crond
(dcron
ディストリビューションに適したパッケージの検索)の説明に従って、crontab のより細かい構文を使用できます。man 1 crontab
0 8 * * wed ID=job1 FREQ=20d your_job
your_job
このコマンドは、最後の試行日から少なくとも20日が経過した場合、水曜日の午前8時に実行されます。
答え3
すでにクローンがありますが、dcron
変更したくない場合は、次のクローン操作を使用できます。
0 8 * * wed n=0 && [[ -e /home/user/.cronjob && -r /home/user/cronjob ]] && read n < /home/user/.cronjob ; [[ $n == 0 ]] && your_actual_job ; echo $(( (n+1) \% 3 )) > /home/user/.cronjob
これは一種の帳簿を実行します。毎週水曜日にクローンジョブが実行されます。.cronjob
0、1、または2のいずれかに記録された値を取得します。 0 の場合、実際のジョブが実行されます。その後、値はモジュロ3にインクリメントされ、書き戻されます.cronjob
。
「%」の前に「\」に注意してください。これは、cronが「%」を特別な方法で解釈するために必要です。