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


8

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

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

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


すべての月に31日があるわけではありませんが、それは問題を引き起こしませんか?
SnakeDoc 2013


@suspectusが提供するソリューションの良い代替案
SnakeDoc

2
日のフィールドの場合は2-31。
2013

@ash-私の答えを見てください、それはまさに私が提案したものです。
slm

回答:


10

コメントで@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

(私が何かを間違ってやっている場合を除き)、実際に、私のために動作するようには思えない-コメントでフォーマットするとひどいです-ので、私は取得しています何のために私のpastbinをしてください参照してください。pastebin.com/RKvy5d4e
SnakeDoc

おっと、あなたの例では0 22 2-31 * *です。私が編集します。
SnakeDoc 2013

1
@SnakeDoc-おかげで、これらのすべての列はしばらくするとブレンドし始めます8
slm

うん、私もそれらを忘れました-私はそれらをセットアップし、その後、私がそれをどのようにしたかを忘れます(manページの笑の良いことです)
SnakeDoc

8

これに対処する最も簡単な方法は、1つのcronエントリを用意することです。日付をチェックするようにbashスクリプトを変更します-それが月の最初の場合は、月ごとのパラメーターでjavaプログラムを呼び出し、そうでない場合は、日ごとのパラメーターでプログラムを呼び出します。

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

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

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

1
結局、この解決策で行きました。私はあなたのサンプルコードで、毎月の下に別のbashスクリプトを作成した-それは(これは基本的なJavaプログラムへの毎月の引数を送り込む)毎月のbashスクリプトをキックオフします、毎日キックを毎日スクリプトオフ、など
SnakeDoc

0
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.