f:id:bakunyo:20130620214241j:plain

Linuxで定期的にコマンドを実行してくれる<span style={{ color: "#ff0000" }}>crontabの使い方をまとめてみました。

まずはcrondが起動しているか確認

デフォルトでは自動起動のはずですが、念の為crondが起動しているかを確認しておきましょう。
ここで起動していなければ、その後の設定をいくらしても動いてくれることはありません:D

# /etc/rc.d/init.d/crond status
crond (pid  xxxx) を実行中...     // ちゃんと起動していますね!

crontabファイルの設定

crondが起動していることを確認できたら、crontabファイルの設定です。
crontabファイルには「<span style={{ color: "#ff0000" }}>この日付のこの時刻にこのコマンドを実行せよ」という命令が書き込まれています。
crontabファイルは/var/spool/cron/userに保存されていますが、基本的にcrontabファイルは直接編集せず、crontabコマンドを使って編集するのが習わしです。
以下はcrontabコマンドの説明です。

crontabコマンド

crontab [-u user] file
 または
crontab [-u user] [-e | -l | -r | -i]

各オプションの説明

オプション 内容
u userに対象となるユーザーを指定
e エディタを起動し、crontabの内容を編集する
l 現在登録されている内容を表示する
r 現在登録されている内容を削除する
i (rと併用して)削除する前に確認プロンプトを表示

オプションでeを指定しようとしたら間違えてrを押してしまい、設定が全て削除されてしまった悲しい事例が各所で報告されています。


crontab -r とやってしまった時の対処法
crontab -r を安全にする - delirious thoughts


誤って削除してしまわないよう、eオプションは使わずに別ファイルにて管理した方が望ましいようです。
現在eオプションのみで管理しているなら、lオプションをリダイレクトして別ファイルに書き出しておきましょう。

# crontab -u user -l > ~/crontab.bk

crontabファイルの書き方

それではメインの、crontabファイルの書き方についてです。
「<span style={{ color: "#ff0000" }}>この日付のこの時刻にこのコマンドを実行せよ」という命令を記述するために、以下の書式を用います。

分 時 日 月 曜日 <コマンド>

日付・時刻を表す5つのフィールドには、以下の値を設定できます。

フィールド 取りうる値
0~59
0~23
1~31
1~12
曜日 0~7

範囲指定

各フィールドは<span style={{ color: "#ff0000" }}>-(ハイフン)でつなげて範囲指定することができます。
以降、分フィールドを書き方の例として挙げていきます。

5-10    // 5分・6分・7分・8分・9分・10分に実行

このように、5-10と範囲指定することで5分~10分の間に毎分コマンドが実行されます。
全範囲(分フィールドだと0~59)を範囲指定したい場合には<span style={{ color: "#ff0000" }}>*(アスタリスク)を使用します。

*   // 毎分実行

リスト指定

不連続な複数の値を指定したい時は、<span style={{ color: "#ff0000" }}>,(カンマ)で区切ってリスト指定することができます。

1,3,5   // 1分・3分・5分に実行

リスト指定の中に範囲指定を含めることも可能です。

1,3,5-10   // 1分・3分・5分・6分・7分・8分・9分・10分に実行

間隔値指定

「◯分間隔」などとしたい場合は、範囲指定と併せて間隔値を指定することができます。
範囲指定の後に<span style={{ color: "#ff0000" }}>/(スラッシュ)をつづけ、その後に間隔値を指定します。

5-10/2   // 5分・7分・9分(5分~10分の間の2分間隔)に実行
*/5   // 5分おきに実行

設定例

これらの書き方を組み合わせて、「<span style={{ color: "#ff0000" }}>この日付のこの時刻に」の部分を指定します。
以下、設定例です。
ここでは仮に、usr/bin/cmdをコマンドとして実行するとします。

00 14 * * * /usr/bin/cmd      // 毎日14:00に実行
* * * * * /usr/bin/cmd        // 毎分実行
15,30 06 * * 2 /usr/bin/cmd   // 毎週火曜日の6:15と6:30に実行
05 23 * 3-5 4 /usr/bin/cmd    // 3~5月の毎週木曜日23:05に実行

といった具合です。

ちょっと細かい話。

cronは毎分このcrontabファイルをチェックし、**<span style={{ color: "#ff0000" }}>分・時・月が現在時刻と一致し、かつ日と曜日フィールドの2つのいずれかが現在時刻と一致すれば**コマンドを実行します。
この部分が少しややこしいのですが、cronは日フィールドと曜日フィールドの2つと見比べてコマンド実行するかを判断します。なので、この2つに関しては少し見方を変えてあげます。
具体的には、日フィールドと曜日フィールドのそれぞれにおいて、(アスタリスク)と以外を指定した場合のどのような指定になるかを分けるとわかりやすいです。

   | 日が*           | 日が*以外       

------ | ------------- | ------------
曜日が* | 毎日 | 日フィールドで指定した日
曜日が*以外 | 曜日フィールドで指定した日 | いずれかに当てはまる日

設定例を以下に挙げます。

00 14 * * * /usr/bin/cmd         // 毎日14:00に実行
00 14 1,5 * * /usr/bin/cmd     // 毎月1日,5日の14:00に実行
00 14 * * 4 /usr/bin/cmd        // 毎週木曜日14:00に実行
00 14 1,5 * 4 /usr/bin/cmd    // 毎月1日,5日と毎週木曜日14:00に実行

といった感じになります。

他にも書くべきこととして**環境変数の指定**などがあるのですが、疲れたのでここまで。