L
がDebianのcron実装で許可されている特殊文字の1つであるかどうかを知りたいですか?毎月の最終日に実行するようにcronを設定しようとしています。
「L」は「最後」を意味します。曜日フィールドで使用すると、特定の月の「最後の金曜日」(「5L」)などの構成を指定できます。日のフィールドでは、月の最後の日を指定します。
注:Lは非標準文字であり、一部のcron実装にのみ存在します(Quartz Java scheduler)
そうでない場合、毎月の最終日に実行するようにcronを設定するにはどうすればよいですか? stackoverflowのこのソリューション のような3つの異なるエントリをお勧めしますか?
Debianのcronエントリについては、crontabのマニュアルページ(man 5 crontab
)。 DebianはVixieのcronを使用しており、manページには次のように書かれています。
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
Linuxのcron実装でL
を見たことはありません。
月の最終日にジョブを実行するには、実際の日のスーパーセットでジョブを実行し、翌日の日付を確認します。 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
私のスクリプトにはその機能があります。それはネイティブ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