web-dev-qa-db-ja.com

特定の日ではなく他のすべての日に実行するCron

毎日午後10時にbashスクリプトを実行するようにcronを設定しています。毎月1日に実行する別のcronセットアップがあります。両方のcronはbashスクリプトを起動し、bashスクリプトの唯一の違いは、基礎となるJavaプログラムに渡す引数です(Java =プログラム)。

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

別のbashスクリプトを作成して、最初の前にcronを編集し、その後に設定を元に戻すことができると思いますが、これは...不明瞭なようです。

8
SnakeDoc

コメントで@StephaneChazelasによって提案されたソリューションと同様に、3番目のフィールドで、月の1日以外に毎日実行するcronの範囲として日数の範囲を指定できます。

次の2つのエントリは、目的を達成します。

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

これに対処する最も簡単な方法は、1つのcronエントリを用意することです。 bashスクリプトを変更して日付を確認します。月の最初の場合は、Javaプログラムに月次パラメーターを指定して呼び出します。それ以外の場合は、日次パラメーターを指定してプログラムを呼び出します。

スクリプトを変更すると、ドキュメントとしてのスクリプトは、cronテーブルに追加情報を必要とせずに、何が起こっているかをより詳しく説明するので、プロセスが単純になります。

スクリプトmodは次のようになります。

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

もっと正確であれば整数比較を使用すると思います

日付 '+%d'は1ではなく01を返すため、==文字列比較を使用するとfalseになります

代わりに

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