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

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

LこれがDebianのcron実装に許可されている特殊文字の1つかどうか疑問に思います。毎月最後の日に実行するcronを設定しようとしています。

~からWikipediaのcronエントリー:

「L」は「最後」を意味する。曜日フィールドに使用される場合、その月の「最後の金曜日」(「5L」)などの構造を指定できます。日付フィールドには、その月の最終日を指定します。

注:Lは非標準文字であり、一部のcron実装(Quartz Javaスケジューラ)にのみ存在します。

そうでない場合は、毎月最後の日に実行するようにクローンをどのように設定しますか? 3つの異なる項目をお勧めしますか?stackoverflowのこのソリューション

答え1

Debian の Cron エントリはman 5 crontabcrontab のマニュアルページ ( ) に記載されています。 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

LLinuxの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 crontabcrontab

「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

関連情報