web-dev-qa-db-ja.com

CronはDebianで「月の最後の日」に特殊文字「L」を許可しました

LがDebianのcron実装で許可されている特殊文字の1つであるかどうかを知りたいですか?毎月の最終日に実行するようにcronを設定しようとしています。

wikipediaのcronエントリ から:

「L」は「最後」を意味します。曜日フィールドで使用すると、特定の月の「最後の金曜日」(「5L」)などの構成を指定できます。日のフィールドでは、月の最後の日を指定します。

注:Lは非標準文字であり、一部のcron実装にのみ存在します(Quartz Java scheduler)

そうでない場合、毎月の最終日に実行するようにcronを設定するにはどうすればよいですか? stackoverflowのこのソリューション のような3つの異なるエントリをお勧めしますか?

8
Jeff

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
6
Drav Sloan

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
0
MGP