3日ごとにcronjobを実行することは可能ですか?または多分10回/月。
3日ごとにcronjobを実行することは可能ですか?または多分10回/月。
回答:
3日ごとに実行します...
0 0 */3 * *
どのようにそのことについて?
1日目、4日目、7日目などの特定の日に実行する場合は、スクリプトで、月の現在の日をチェックする条件付きにすることができます。
if (((date('j') - 1) % 3))
exit();
または、@ marioが指摘するように、date( 'k')を使用して、月の日付に基づいて計算する代わりに、年の日付を取得できます。
0 0 */3 * *
は、1日、4日、7日などに実行されることを意味します(*/3
はを1-31/3
意味します1,4,7...31
)。そのため、月末にギャップが小さくなります。(前月は31日だった場合は、行で2日間実行されます。)date('j') % 3
パターンは毎年再起動することで同様の問題があり、年が3で割り切れる日数を持っていない
* * */3 * * that says, every minute of every hour on every three days.
0 0 */3 * * says at 00:00 (midnight) every three days.
私はcronの専門家ではありませんが、次の点についてはどうですか。
0 */72 * * *
72時間ごとに中断なしで実行されます。
then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
cronは「ステートレス」であるため、「頻度」を正確に表現することはできず、現在の時間と(見かけ上)継続的に一致する「パターン」のみを表現できます。
質問を言い換えると、これはより明白になります:「2夜以内に実行された夜をスキップすることを除いて、毎晩00:01にcronjobを実行することは可能ですか?」cronが現在の時刻とジョブリクエストの時刻パターンを比較しているとき、cronが過去にジョブを実行したかどうかを知る方法はありません。
通常、その定期的なイベントを終了し、完全に新しいイベントを再開する必要があります。これは、複雑なカレンダーアプリでさえ繰り返しパターンを表す方法の限られた表現力を示しています。そしてもちろん、カレンダーには多くの状態があります-個々のイベントは個別に削除または再スケジュールできます(ほとんどのカレンダーアプリで)。
さらに、成功した場合は3夜ごとにジョブを実行することをお勧めしますが、最後のジョブが失敗した場合は、次の夜(3日以上待たない)または1時間後のようにもっと早く(ただし、再試行を停止する)すぐに再試行します。朝の到着時)。明らかに、cronはジョブが成功したかどうかを知ることができず、パターンは代替のより頻繁な「再試行」スケジュールも表現できません。
とにかく、自分のやりたいことができる。スクリプトを記述し、毎晩00:01に実行するようにcronに指示します。このスクリプトは、「最後の実行」を記録する何か*のタイムスタンプをチェックし、それが3日以上前**の場合、ジョブを実行し、「最後の実行」のタイムスタンプをリセットします。
(*タイムスタンプ付きのインジケーターは、永続化された状態であり、操作および検査できますが、cronではできません)
**人間が読み取れる時計を使用している場合は、時間の計算に注意してください。年に2回、一部の日は1日23時間または25時間で、02:00-02:59は1日2回発生するか、またはすべて。これを回避するには、UTCを使用してください。
0 0 1-30/3 * *
これは、1日から3日ごとに実行されます。ここに20のスケジュールされた実行があります-
私はあなたが必要なものを持っているとは思いません:
0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!
残念ながら、* / 3は、上の間隔を設定している毎月のn日とない すべてのn日。参照してください:ここでの説明を。月末には、定期的な問題が保証されています。
1st at 2019-02-01 00:00:00
then at 2019-02-04 00:00:00 << 3 days, etc. OK
then at 2019-02-07 00:00:00
...
then at 2019-02-25 00:00:00
then at 2019-01-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...
この記事によると、「N日ごと」のTRUEを取得するには、実行中のコマンドにモジュロ演算を追加する必要があります。例えば:
0 0 * * * bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh
この例では、ジョブは毎日午前12時にチェックされますが、1970年1月1日からの剰余3からの日数が0の場合にのみ実行されます。
特定の日付から3日ごとにする場合は、次の形式を使用します。
0 0 * * * bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh
どうですか:
00 00 * * * every 3 days && echo test
every
スクリプトはどこにありますか:
#!/bin/sh
case $2 in
days)
expr `date +%j` % $1 = 0 > /dev/null
;;
weeks)
expr `date +%V` % $1 = 0 > /dev/null
;;
months)
expr `date +%m` % $1 = 0 > /dev/null
;;
esac
したがって、毎日実行されます。
*/3
月の3、6、...、27、30日に実行を使用しますが、1か月が31日になると間違って実行されます。every
このスクリプトは、年度終了後だけ間違っています。
の基本を学ぶ必要がありcrontab
ます。
編集コマンドでcronをcrontab -e
してから⌃ (CTRL)+ X、その後Y、最後に押してENTER (return)、ファイルを保存するMac上。新しいcronがインストールされているかどうかを確認できますcrontab -l
crontabファイルには、分、時間、日、月、曜日を指定するための5つのフィールドがあり、その後にその間隔で実行されるコマンドが続きます。
* * * * * command to be executed
- - - - -
| | | | |
| | | | +----- day of week (0-6) (Sunday=0)
| | | +------- month (1-12)
| | +--------- day of month (1-31)
| +----------- hour (0-23)
+------------- min (0-59)
*
上記の値フィールドのは、その列の波括弧内のすべての有効な値を意味します。
ここで、私はそれに関する詳細な投稿を書きました:Unixでのセットアップcron