CRON の実行をスケジュールする方法はありますか?
- 年間25週目から36週目までのみ
- 月曜~金曜のみ(週末は除く)
これは、夏休み期間中に当社の製品に対する注文が集中するためです。毎週 CRON 設定を変更するのは非常に面倒です。@weekly はスター設定と組み合わせることができないため、次のようなものは有効なマークアップではないことは理解しています。
* * 1,2,3,4,5 * * @weekly php /app/cmd import >> /logs/cron-offers.log
答え1
これは次のように実行できるはずです:
# m h dom mon dow command
* * * * 1-5 /bin/bash -c "if [ `date +%W` -lt 15 ] && [ `date +%W` -gt 11 ]; then php /app/cmd import >> /logs/cron-offers.log; fi"
最初と2番目の「[]」に正しい週番号を入力してください。
答え2
Cron は、結局のところ非常に基本的なスケジューラであり、構文では管理者が少し変わったスケジュールを簡単に作成することはできません。標準の cron では週番号を使用できないため、創造性を発揮する必要があります。
25週目から36週目までは次のとおりncal -w 2018
です。
May June July August September
Mo 7 14 21 28 4 11 18 25 2 9 16 23 30 6 13 20 27 3
Tu 1 8 15 22 29 5 12 19 26 3 10 17 24 31 7 14 21 28 4
We 2 9 16 23 30 6 13 20 27 4 11 18 25 1 8 15 22 29 5
Th 3 10 17 24 31 7 14 21 28 5 12 19 26 2 9 16 23 30 6
Fr 4 11 18 25 1 8 15 22 29 6 13 20 27 3 10 17 24 31 7
Sa 5 12 19 26 2 9 16 23 30 7 14 21 28 4 11 18 25 1 8
Su 6 13 20 27 3 10 17 24 1 8 15 22 29 5 12 19 26 2 9
18 19 20 21 22 22 23 24 25 26 26 27 28 29 30 31 31 32 33 34 35 35 36
1 つの方法は、複数のバッチを作成し、それらを組み合わせて必要なスケジュールを作成することです。たとえば、最初に 6 月の最後の 2 週間の平日を選択し、次に 2 番目のジョブで 7 月と 8 月のすべての平日を選択し、3 番目のジョブで 9 月の最初の日を選択します。
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
* * 18,19,20,21,22,25,26,26,28,29 jun * php /app/cmd import >> /logs/cron-offers.log
* * * jul,aug mon,tue,wed,thu,fri php /app/cmd import >> /logs/cron-offers.log
* * 3-7 9 * php /app/cmd import >> /logs/cron-offers.log
もう 1 つのオプションは、バッチを毎日実行し、適切なプログラミング/スクリプト言語のより強力な構文を使用して、バッチ プロセス自体 (つまり、PHP コード) に、実行するかすぐに終了するかを決定させることです。