5

70分または210分ごと、つまり>60分ごとに実行されるようにcron式を設計する方法はありますか。これを検索しようとしましたが、見つかりませんでした。

私はついに、5分ごと(または最適な繰り返し時間)に呼び出される必要な時間チェックを実行するラッパースクリプトを使用しました。

cron式でそのようなタスクを実行する方法は?

4

3 に答える 3

0

この答えはこれこれとかなり同じです

毎分 cron を実行するn場合は、次の 2 つのケースを考慮する必要があります。

  • n分 (60 は で割り切れnます)
  • (ジェネリック)nから 1 分ごとYYYY-MM-DD HH:MM:00

後者はOPのケースをカバーしていますが、一般的なままにするために、両方のケースを提示します。

n分 (60 は で割り切れnます)

n=1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30これは ( )に有効です

このために、範囲とステップ値の定義の組み合わせを使用します。

man 5 crontab:ステップ値は、範囲と組み合わせて使用​​できます。範囲の後に を/<number>指定すると、範囲内での数値の値のスキップが指定されます。たとえば 0-23/2、「hours」フィールドで を使用して、1 時間おきにコマンドを実行するように指定できます (V7 標準の代替手段は です0,2,4,6,8,10,12,14,16,18,20,22)。アスタリスクの後にステップ値を指定することもできるため、ジョブを 2 時間ごとに実行するように指定する場合は、 を使用できます*/2

次の例を参照してください。

# 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)
# |   |  |  |  |
# *   *  *  *  *   command to be executed
  m/n *  *  *  *   command1

ここでcommand1は、m から 59 まで n 分ごとに実行されます。

この意味は :

  • の場合m<=n、それらは常にn分間隔になります。例えば。m=2,n=10:: ジョブは数分で実行されます2,12,22,32,42,52
  • の場合、時間の開始時を除いて、m>n常に分間隔になります。n例えば。m=12,n=10:: ジョブは分単位で実行され 12,22,32,42,52ます。ここでは、秒52と分の間に 20 分のジャンプがあり12thます。

注:nが60 を完全に分割しない場合、問題が発生することがはっきりとわかります。例えば。m=0,n=11で実行される 0,11,22,33,44,55ため、次の実行まで 5 分しかありません。

から始まる毎nYYYY-MM-DDTHH:MM:00

毎分 cron を実行したい場合n、これを cron できれいに実行することはできませんが、可能です。これを行うには、テストが時間をチェックする cron にテストを配置する必要があります。これは、UNIX タイム スタンプ、つまり からの合計秒数を調べるときに行うのが最適1970-01-01 00:00:00 UTCです。McFly が Riverdale に到着した瞬間から始めたいとしましょう:

% date -u -d '2015-10-21 07:28:00' +%s 
1445412480

# 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)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
  *  *  *  *  *   mintestcmd "2015-10-21 07:28:00"   7 && command1
*/10 *  *  *  *   mintestcmd "2015-10-21 07:00:00"  70 && command2
*/30 *  *  *  *   mintestcmd "2015-10-21 07:00:00" 210 && command3

としてmintestcmd定義された

#!/usr/bin/env bash
starttime=$(date -d "$1" "+%s")
# return UTC time
now=$(date "+%s")
# get the amount of minutes
delta=$(( (now - starttime) / 60 ))
# set the modulo
modulo=$2
# do the test
(( delta >= 0 )) && (( delta % modulo == 0))

上記の例には、次のものがあります。

  • command12015-10-21 07:28:002015-10-21 07:35:002015-10-21 07:42:002015-10-21 07:49:00、 ...に 7 分ごとに実行されます。
  • command22015-10-21 07:00:00以降、70分間隔で運行。70 は 10 で割り切れ、開始時刻は完全に正時に始まるため、cron を 10 分ごとに実行するように設定できます。
  • command3以降210分間隔で運行2015-10-21 07:00:00。210 は 30 で割り切れ、開始時刻は完全に正時に始まるため、cron を 30 分ごとに実行するように設定できます。

注意: UNIX 時間は UTC で表示されます。夏時間の影響を受ける別のタイムゾーンで cron を実行する場合は、2 時から 3 時の間にコマンドを実行しないことをお勧めします。これにより、コマンドがスキップされるか、コマンドが 2 回実行される可能性があります (時間が進むか戻るかによって異なります)。

注意: UNIX時間はうるう秒の影響を受けません

備考: cron 1 秒未満の精度はありません

于 2018-04-17T10:03:48.323 に答える