31は必ずしもcronジョブの月末を意味しますか?


13

cronジョブの場合、次のように時間を設定できることがわかっています。

# +------------ Minute (0 - 59)
# | +---------- Hour (0 - 23)
# | | +-------- Day of the Month (1 - 31)
# | | | +------ Month (1 - 12)
# | | | | +---- Day of the Week (0 - 7) (Sunday is 0 or 7)
# | | | | |
# * * * * * command

私が知りたいのは、月31日を設定するとき、これは各月の終わりを意味するということです。ただし、月には31日がありません。

前もって感謝します

回答:


22

いいえ、31は31を意味します。

ただし、いくつかのトリックを行うことができます。月の最終日になる可能性のある任意の日にジョブを実行するように設定します(つまり、日フィールドに28-31)。次に、コマンドを、コマンド:

0 0 28-31 * * [ "`date +%m`" != "`date --date=tomorrow +%m`" ] && command

テストブラケット内の式は、今日の月番号が明日の月番号と異なるかどうかを尋ねるだけです。これはもちろん、月の最後の日にのみ当てはまります。この式の形式はローカルによって異なることに注意してくださいdate-現在のGNUバージョンがない場合は、微調整する必要があります。

私はこれを発明しなかったと言うべきです-私は、Matthew Jarvisによるメーリングリストの投稿で簡単なGoogleでそれを見つけました。しかし、これは非常に標準的な古いUnixウィザードのトリックだと思います。


1
「日付」にGNU固有のオプションが与えられていることを考えると、これはあまりにも古いトリックではありません=)
jj33

4
stackexchangeサイトでは、Google検索で回答できる質問をすることは悪いことではありません。実際、Googleでこれを検索する次の人がstackexchangeで答えを見つけてここに来るので、それは良いことです。
-miernik

12

いいえ、あなたができる最善の方法は、月の1日の午前0時に実行するか、各月に個別のcrontab行を設定することです(少なくとも、28、29、30、および31日の月の行)。

0 0 28,29 2               * /my/command
0 0 30    4,6,9,11        * /my/command
0 0 31    1,3,5,7,8,10,12 * /my/command

ポールありがとう!2番目の手順に従います。2番目の方法では、同じファイルを3回正しく設定する必要がありますか?再度ありがとう:)

はい、繰り返す必要があります。
ポールディクソン

7
cronの経験はありませんが、うるう年に「0 0 28,29 2」が2回実行されませんか?これが今後2年間問題になるわけではありませんが、それでも…
Wim ten Brink

それは良い点で、簡単な方法ではありません
ポールディクソン

4

これを簡単にできるとは思わないcrontab

1つのオプションはcron、スクリプトを毎日実行するように設定し、スクリプト自体が月の最終日であるかどうかを確認することです。


3

cronには、この目的のための特別な文字「L」があると思います。

*    *    L    *    *    your_script.sh 

毎月の最終日にスクリプトを実行します

一方、

*    *    0    *    *    your_script.sh

次のように指定することもできます。

*    *    *    *    1,5L    your_scrript.sh

各月の最後の月曜日と金曜日にスクリプトを実行する

または

*    *    *    *    1    your_script.sh

毎週月曜日の真夜中にスクリプトを実行します。


0

これは仕事をします:

if [ $( date +%-d --date="tomorrow" ) -eq 1 ]
then echo Last day of the current month
else echo Not yet!
     exit 0
fi

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