カスタムタイミングでcrontabでジョブをスケジュールする

カスタムタイミングでcrontabでジョブをスケジュールする

crontab で毎月 12 日に実行されるジョブをスケジュールし、12 日が週末の場合は翌月曜日に実行する方法について、どなたか教えてください。

インターネットで何かを見つけたのですが、うまくいきません

0 0 12 * * [ "$(date +%d -d tomorrow)" == "12" ] && [ "$(date +%u -d 12th)" -gt 5 ] && your-command

これはChatGPTが私に与えたものです。これをデバッグする方法はわかりません

答え1

私の一般的な推奨事項cron が提供する限られた構文でスケジュールを簡単にフォーマットできない場合は、非常に複雑な cron コマンドを作成しようとしないでください。

回避策としては、必要以上に(少し)頻繁にスケジュールを実行し、バッチジョブまたはラッパーシェルスクリプトで、よりリッチな環境で「複雑な必要なロジックを実行します。バッチの実行が許可されている場合はジョブを実行し、許可されていない場合は正常に終了します。

cron では、常に 12、13、14 日目に実行されるラッパー スクリプトからバッチを実行するようにスケジュールするか、毎日実行できるようにします。

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  *  command to be executed
25 4 12,13,14 * *   /path/to/your/wrapper.script
# or even: 
25 4 * * *  /path/to/your/wrapper.script

そして、そのラッパー シェル スクリプトでロジックを適用します。

  • 今日が12日で平日の場合:
    ジョブを実行し、そうでない場合は正常に終了します

  • 今日が13かつ月曜日の場合:
    (12は日曜日でジョブは実行できませんでした)
    ジョブを実行し、そうでない場合は正常に終了します。

  • 今日が14日で月曜日の場合:
    (12日は土曜日でジョブは実行できませんでした)
    ジョブを実行し、そうでない場合は正常に終了します。

bash スクリプトは/path/to/your/wrapper.script次のようになります。

#!/bin/bash
# Wrapper script that will run_batch() on the 12th when 
# the 12th is a weekday, otherwise the following Monday 

run_batch () {
    # Add the real job here
    echo "The job has started"
}

TODAY=$(date +%d) 
#  date +%u     day of week (1..7); 1 is Monday
WEEKDAY=$(date +%u)  

if [ "${TODAY}" -eq 12 ] && [ "${WEEKDAY}" -le 5 ] ; then 
     run_batch
elif [ "${TODAY}" -eq  13 ] && [ "${WEEKDAY}" -eq  1 ] ; then
     run_batch
elif [ "${TODAY}" -eq 14 ] && [ "${WEEKDAY}" -eq  1 ] ; then
    run_batch
else
    exit    
fi

関連情報