L
これがDebianのcron実装に許可されている特殊文字の1つかどうか疑問に思います。毎月最後の日に実行するcronを設定しようとしています。
「L」は「最後」を意味する。曜日フィールドに使用される場合、その月の「最後の金曜日」(「5L」)などの構造を指定できます。日付フィールドには、その月の最終日を指定します。
注:Lは非標準文字であり、一部のcron実装(Quartz Javaスケジューラ)にのみ存在します。
そうでない場合は、毎月最後の日に実行するようにクローンをどのように設定しますか? 3つの異なる項目をお勧めしますか?stackoverflowのこのソリューション?
答え1
Debian の Cron エントリはman 5 crontab
crontab のマニュアルページ ( ) に記載されています。 Debian は Vixie の cron を使用し、マンページには次のように記載されています。
The crontab syntax does not make it possible to define all possible
periods one could image off. For example, it is not straightforward to
define the last weekday of a month. If a task needs to be run in a spe-
cific period of time that cannot be defined in the crontab syntaxs the
best approach would be to have the program itself check the date and
time information and continue execution only if the period matches the
desired one.
If the program itself cannot do the checks then a wrapper script would
be required. Useful tools that could be used for date analysis are ncal
or calendar For example, to run a program the last Saturday of every
month you could use the following wrapper code:
0 4 * * Sat [ "$(date +%e)" = "`ncal | grep $(date +%a | sed -e 's/.$//')
| sed -e 's/^.*\s\([0-9]\+\)\s*$/\1/'`" ] && echo "Last Saturday" &&
program_to_run
したがって、次のように作業します。
0 0 * * * perl -MTime::Local -e
'exit 1 if (((localtime(time()+60*60*24))[3]) < 2);' || program_to_run
答え2
L
Linuxのcron実装でこれが起こるのを見たことはありません。
毎月末日にジョブを実行するには、実際の日数の親セットで実行し、翌日の日付を確認してください。 GNUを使用すると、翌日の日付を表示date
して、date -d tomorrow
その日付がまだ同じ月であることを確認できます。夏時間が開始または終了する日に特定の場所で問題が発生しないようにするには、早朝(例では12:00 /正午)ではない時間を指定してください。これは%
crontabで特別でバックスラッシュで保護する必要があることを覚えておいてください。
42 1 28-31 * * if [ "$(date -d 'today 12:00' +\%m)" != "$(date -d 'tomorrow 12:00' +\%m)" ]; then last_day_of_month_job; fi
その月の特定の曜日が最後に表示されても、同じスキルを適用できます。ジョブは毎週実行され、次の発生が他の月に発生した場合にのみトリガーされます。
42 1 * * 3 if [ "$(date -d 'today 12:00' +\%m)" != "$(date -d 'now + 7 days 12:00' +\%m)" ]; then last_wednesday_of_month_job; fi
答え3
時計を変えなければならないので、これを実験的に確認するのはややぎこちないようです。
Debianはビキシクロン実装についてはWikipediaの記事に記載されています。 crontab式の形式は で説明されていますが、これは同じではないman 5 crontab
ので少しトリッキーです(基本セクション1はコマンドで、セクション5は「crontab」ファイルの形式です)。man crontab
crontab
「L」は言及されない。
WRT SOの代替手段である確認済みの回答は、従うのが最も簡単で、外部スクリプトなどを必要としません。 OTOH、うるう年の問題があります...
答え4
私のスクリプトにはその機能があり、デフォルトのcronではありませんが、トリックを実行します。
http://xr09.github.io/cron-last-sunday/
例:
# every last sunday
30 6 * * 7 root run-if-today L && /root/myscript.sh
# every third tuesday
30 6 * * 2 root run-if-today 3 && /root/myscript.sh