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行に直接置くことができます(この場合はバックスラッシュを削除)。

おすすめ記事