Cronjobは3週間ごとに水曜日にスクリプトを実行します。

Cronjobは3週間ごとに水曜日にスクリプトを実行します。

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は通常、ユーザーのホームディレクトリのどこかにある任意のパス名(最初は存在しません)です(シンボリックリンク攻撃を防ぐために他のユーザーが書き込むことができるディレクトリを使用しないでください)。コードは次のように動作します。

  1. このパス名がまだ存在しない場合は、現在の日付をコンテンツとして使用してパス名を作成し、コマンドを実行します。日付は、エポックと呼ばれるいくつかの起源の後に秒単位で表示されます。
  2. このパス名が存在する場合(この場合はこのスクリプトによって生成されたと仮定)、コマンドが最後に実行された日付を指定します。この日付に20日(20 * 86400秒)を加え、結果を現在の日付と比較します。少なくとも20日が経過した場合は、パス名の内容を現在の日付に更新してコマンドを実行します。

このコードは毎週水曜日(午前8時)cronを介して実行されるため、コマンドは3週間ごとに実行されます(1〜2週間後、まだ20日経過していません)。

この回避策は、3 番目の水曜日より前にコンピュータがシャットダウンしても動作し続けます。何らかの理由でマシンが3番目の水曜日に終了すると、マシンがオンになってから水曜日にコマンドが実行されます(質問では、コマンドは水曜日の午前8時にのみ実行される必要があります)。

編集する:上記のコードを独自のファイルに入れたり(スクリプトで実行)、crontabファイルの1行に直接置くことができます(この場合はバックスラッシュを削除)。

答え2


GNU/Linux と dillon を使用している場合cronddcronディストリビューションに適したパッケージの検索)の説明に従って、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

これは一種の帳簿を実行します。毎週水曜日にクローンジョブが実行されます。.cronjob0、1、または2のいずれかに記録された値を取得します。 0 の場合、実際のジョブが実行されます。その後、値はモジュロ3にインクリメントされ、書き戻されます.cronjob

「%」の前に「\」に注意してください。これは、cronが「%」を特別な方法で解釈するために必要です。

関連情報