crontab - 時間ベースのジョブスケジューラの管理

スポンサーリンク

crontabコマンドはcronデーモンを動かすために使われるテーブルを追加、削除、表示するために使われるコマンドになります。
主な用途として、crontabコマンドを利用すると定期的に実行したいコマンドやスクリプトを設定できます。
crontabコマンドはユーザーごとにジョブを管理するので、それぞれのユーザーは自身のcrontabファイルを持ち、ジョブをスケジュールできます。
systemdでもタイマーを用いれば、同じようなことができますが、crontabの方がシンプルで直感的な記述を行うことができるため、ジョブスケジューラとして扱いやすいツールになります。

スポンサーリンク

crontabファイルの構文

crontabファイルを最初に編集する場合、多くのコメントがあり、最後の方に以下のようなコメントがあります。

この空白文字区切りの構文がそのまま、crontabファイルを記述する際の構文になります。

m, h, dom, mon, dowは

値の範囲
minute0-59
hour0-23
day of month1-31
month1-12 (又はJun,Feb,...等の略語)
day of week0-7 (0 or 7 is Sun, 又はSun,Mon,...等の略語)

を意味します。値はリストが許されていて、カンマ区切りで指定できます。

ステップ値は/で使うことができます。/2のように利用でき、範囲と組み合わせて利用できます。
例えば、時間のところで

を用いると

の値を意味します。

月と曜日はアルファベット3文字の略称が大文字小文字区別なく利用できます。
下の表では先頭の文字が大文字ですが、略称の文字が全て大文字や全て小文字も可能です。

英語略称
1月JanuaryJan
2月FebruaryFeb
3月MarchMar
4月AprilApr
5月MayMay
6月JuneJun
7月JulyJul
8月AugustAug
9月SeptemberSep
10月OctoberOct
11月NovemberNov
12月DecemberDec
曜日英語略称
日曜日SundaySun
月曜日MondayMon
火曜日TuesdayTue
水曜日WednesdayWed
木曜日ThursdayThu
金曜日FridayFri
土曜日SaturdaySat

特殊な期間指定の文字列

期間を指定する5つの列(分、時、日、月、曜日)の代わりに以下の特殊な文字列を指定することができます。

文字列意味
@rebootRun once, at startup.
@yearlyRun once a year, "0 0 1 1 *".
@annually(same as @yearly)
@monthlyRun once a month, "0 0 1 * *".
@weeklyRun once a week, "0 0 * * 0".
@dailyRun once a day, "0 0 * * *".
@midnight(same as @daily)
@hourlyRun once an hour, "0 * * * *".

時間指定の例

毎分

5分ごと

1,4,7月の1日の0時

土日の0時

crontabファイルの記述の仕方は

で参照できます。

crontabファイルの作成・編集(-eオプション)

-eオプションを用いて、crontabファイルの作成・編集を行うことができます。crontabファイルはユーザーごとに管理されています。
コマンドを実行したらエディタが開かれます。エディタは環境変数EDITORで設定できます。

コマンド例

現在のcrontabファイルを表示(-lオプション)

-lオプションを用いると、現在のcrontabファイルを表示できます。

コマンド例と実行結果

crontabファイルの削除(-rオプション)

-rオプションを用いると、crontabファイルを削除できます

コマンド例と実行結果

crontabファイルの削除時に確認ダイアログを出す(-iオプション)

-iオプションを用いると、crontabファイルの削除時に確認ダイアログを出すことができます。

コマンド例と実行結果

指定したcrontabファイルのインストール(オプションなし)

crontabコマンドをオプションなしで用いると、引数にしたファイルをcrontabファイルとしてインストールできます。

コマンド例と実行結果

crontab -lと組み合わせるとsedコマンド等を用いた編集に利用できます。

ただし、crontabファイルが置き換わるため、sedコマンド等が間違えていたら、現在のcrontabファイルが消える可能性があるので、このような編集を行う場合は予めバックアップファイルを作成しておいたほうが良いでしょう。

別のユーザーを指定(-uオプション)

管理者権限があれば、-uオプションを用いて別のユーザーのcrontabファイルを指定できます。

システムcrontabファイル

/etc/crontabはシステムcrontabファイルになります。このファイルは直接エディタ等で編集を行います。
編集後はcronデーモンによってファイルが監視されているため、ファイルに新しい更新があった場合は自動的に更新内容が取り込まれます。
また、システムcrontabファイルではユーザーも指定することになります。

詳しくは

を参照してください。

cronデーモンで実行されたコマンドの標準出力

cronデーモンで実行されたコマンドの標準出力はシステムに設定されているメールに出力されます。
ここではローカル環境でそのメールを確認するためにpostfixとmuttをインストールして確認してみます。
postfixはメールサーバで、ここではpostfixの設定については省略します。
muttはコマンドラインインターフェースで利用できるテキストベースのメールクライアントになります。

インストールコマンドの例

crontabで以下のような内容のcrontabファイルを作成します。メールの宛先のubuntuの部分はユーザー名になっています。

crontabのコマンドが実行されたかは/var/log/syslogで確認ができます。

メールが送信されたらmuttでメールを確認できます。例えば、以下のような内容のメールが届きます。

また、cronデーモンの標準機能でメール送信を行わずにsendmailコマンド等のコマンドを用いてメールを送る方法もあります。
そうすると、メールの題名等を制御できます。例えば、crontabファイルを以下のように書き換えてみます。

ここで、sedコマンドはメールの題名を挿入しています。また、sendmailコマンドについては

のように指定して利用しています。

メールが送信されたらmuttでメールを確認できます。例えば、以下のような内容のメールが届きます。

最後に、ここでのメール送信はローカル環境でのcronデーモンを用いたメールの送信テストとして利用しているため、実用的かどうかはご自身で判断してもらえると幸いです。