Contents
crontabの時間設定
crontabで定時実行を指定する場合、時間の設定項目は左から「分」「時」「日」「月」「曜日」となっている。
# m h dom mon dow command
* * * * * コマンド
秒単位の設定
cronで指定できる時間の最小単位は分だ。秒単位の指定をする方法としては、次のようにsleepを挟む方法がよく紹介されている。
例)30秒おきに実行
* * * * * コマンド
* * * * * sleep 30; コマンド
同じコマンドを1分間隔で実行するように2つ登録するが、そのうち1つのコマンドはsleepで30秒待つようにする。
こうすれば30秒おきに実行できる。
秒単位設定の欠点
先ほどの設定方法の欠点は、10秒間隔や5秒間隔でコマンドを実行したいときに、コマンドの登録数が増えるということだ。
例)10秒おきに実行
* * * * * コマンド
* * * * * sleep 10; コマンド
* * * * * sleep 20; コマンド
* * * * * sleep 30; コマンド
* * * * * sleep 40; コマンド
* * * * * sleep 50; コマンド
crontabの行数が増えて読みにくくなるし、それぞれの行にかかれたsleepの秒数をチェックしないと何秒おきの実行なのかが分からない。
秒単位の設定を工夫する
10秒間隔のcron実行を1行で表すにはこのように書くときれいでよい。
* * * * * for i in `seq 0 10 59`;do (sleep ${i}; コマンド) & done;
※N秒間隔で設定するためには`seq 0 10 59`の10の部分をNに置き換える。
`seq 0 10 59`は「0から59のシーケンスから10個おきに番号を取得する」コマンドだ。
$ seq 0 10 59
0
10
20
30
40
50
つまり先のforを使ったcrontab設定では次のコマンドを実行することになる。
(sleep 0; コマンド) &
(sleep 10; コマンド) &
(sleep 20; コマンド) &
(sleep 30; コマンド) &
(sleep 40; コマンド) &
(sleep 50; コマンド) &
先にあげた10秒おきに実行する例と同じように6個のコマンドがそれぞれの秒数スリープした後で実行される。
大事なのは&でバックグランド実行にすることである。
バックグランドにしておかないとコマンドの実行にかかる時間の分だけ次のコマンドの開始時間がズレてしまうからだ。