毎n
分cronを実行したい場合、の値に応じていくつかの可能なオプションがありますn
。
n
60を割ります(1、2、3、4、5、6、10、12、15、20、30)
ここでは、/
表記法を利用することで解決策は簡単です。
# 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-59/n * * * * command
上記のn
は値n
をm
表し、n
またはより小さい値を表します*
。これは、コマンドを分で実行しますm,m+n,m+2n,...
n
60を割りません
n
が60を除算しない場合、cronでこれをきれいに行うことはできませんが、それは可能です。これを行うには、テストが時間をチェックするcronにテストを置く必要があります。これは、UNIXのタイムスタンプ(からの合計秒数)を確認するときに最適1970-01-01 00:00:00 UTC
です。Marty McFlyがRiverdaleに到着したときに最初にコマンドを実行し、その後、毎n
分繰り返したいとしましょう。
% date -d '2015-10-21 07:28:00' +%s
1445412480
42
cronjobが「2015-10-21 07:28:00」以降1分ごとに実行される場合、crontabは次のようになります。
# 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
* * * * * minutetestcmd "2015-10-21 07:28:00" 42 && command
minutetestcmd
ように定義
#!/usr/bin/env bash
starttime=$(date -d "$1" "+%s")
# return UTC time
now=$(date "+%s")
# get the amount of minutes (using integer division to avoid lag)
minutes=$(( (now - starttime) / 60 ))
# set the modulo
modulo=$2
# do the test
(( now >= starttime )) && (( minutes % modulo == 0 ))
リマーク: UNIX時間はうるう秒の影響を受けません
備考: cron
1秒未満の精度はありません