Cronは特定の日付にのみ実行されず、他のすべての日付で実行されます。

Cronは特定の日付にのみ実行されず、他のすべての日付で実行されます。

毎晩10時にbashスクリプトを実行するcron設定があります。毎月1日に実行される別のクローン設定があります。どちらのクローンも bash スクリプトを実行します。 bashスクリプトの唯一の違いは、基本Javaプログラムに渡すパラメータです(Javaプログラムのコマンドライン実行シミュレーション)。

問題は、毎月1日に1日のクローンを何らかの方法で無効にする必要があり、両方が同じ日に実行されないようにする必要があることです。これは自動的に実行できますか?

最初のスクリプトの前にcronを編集してバックアップを設定した後、再びbashスクリプトを編集するための別のbashスクリプトを生成できると思いましたが、それはきれいではないようです。

答え1

アノテーションで@StephaneChazelasが提案したソリューションと同様に、毎月1日ではなく毎日cronを実行したい3番目のフィールドに日付範囲を指定できます。

次の2つの項目が操作を完了します。

   0 22 1 * *      /path/to/script/1st_of_the_month.bash    
   0 22 2-31 * *   /path/to/script/every_day_except_1st.bash

答え2

この問題を処理する最も簡単な方法は、cronエントリを1つだけ持つことです。 bashスクリプトを変更して日付を確認してください。その月の1日の場合は毎月のパラメータでJavaプログラムを呼び出し、それ以外の場合は1日のパラメータでプログラムを呼び出します。

スクリプトを変更すると、cronテーブルに追加情報を必要とせずにスクリプトをドキュメントとして使用して、現在の状況をよりよく説明できるため、プロセスが簡単になります。

スクリプトモードは次のとおりです。

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi

答え3

if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

整数比較を使用する方がより正確になると思います。

date '+%d' は 1 ではなく 01 を返すため、== を使用した文字列比較は false です。

代わりに

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi

関連情報