crontabコマンドはcronデーモンを動かすために使われるテーブルを追加、削除、表示するために使われるコマンドになります。
主な用途として、crontabコマンドを利用すると定期的に実行したいコマンドやスクリプトを設定できます。
crontabコマンドはユーザーごとにジョブを管理するので、それぞれのユーザーは自身のcrontabファイルを持ち、ジョブをスケジュールできます。
systemdでもタイマーを用いれば、同じようなことができますが、crontabの方がシンプルで直感的な記述を行うことができるため、ジョブスケジューラとして扱いやすいツールになります。
目次
crontabファイルの構文
crontabファイルを最初に編集する場合、多くのコメントがあり、最後の方に以下のようなコメントがあります。
1 |
# m h dom mon dow command |
この空白文字区切りの構文がそのまま、crontabファイルを記述する際の構文になります。
m, h, dom, mon, dowは
列 | 値の範囲 |
---|---|
minute | 0-59 |
hour | 0-23 |
day of month | 1-31 |
month | 1-12 (又はJun,Feb,...等の略語) |
day of week | 0-7 (0 or 7 is Sun, 又はSun,Mon,...等の略語) |
を意味します。値はリストが許されていて、カンマ区切りで指定できます。
1 2 |
1,2,5,9 0-4,8-12 |
ステップ値は/で使うことができます。/2のように利用でき、範囲と組み合わせて利用できます。
例えば、時間のところで
1 2 |
0-23/2 */2 |
を用いると
1 |
0,2,4,6,8,10,12,14,16,18,20,22 |
の値を意味します。
月と曜日はアルファベット3文字の略称が大文字小文字区別なく利用できます。
下の表では先頭の文字が大文字ですが、略称の文字が全て大文字や全て小文字も可能です。
月 | 英語 | 略称 |
---|---|---|
1月 | January | Jan |
2月 | February | Feb |
3月 | March | Mar |
4月 | April | Apr |
5月 | May | May |
6月 | June | Jun |
7月 | July | Jul |
8月 | August | Aug |
9月 | September | Sep |
10月 | October | Oct |
11月 | November | Nov |
12月 | December | Dec |
曜日 | 英語 | 略称 |
---|---|---|
日曜日 | Sunday | Sun |
月曜日 | Monday | Mon |
火曜日 | Tuesday | Tue |
水曜日 | Wednesday | Wed |
木曜日 | Thursday | Thu |
金曜日 | Friday | Fri |
土曜日 | Saturday | Sat |
特殊な期間指定の文字列
期間を指定する5つの列(分、時、日、月、曜日)の代わりに以下の特殊な文字列を指定することができます。
文字列 | 意味 |
---|---|
@reboot | Run once, at startup. |
@yearly | Run once a year, "0 0 1 1 *". |
@annually | (same as @yearly) |
@monthly | Run once a month, "0 0 1 * *". |
@weekly | Run once a week, "0 0 * * 0". |
@daily | Run once a day, "0 0 * * *". |
@midnight | (same as @daily) |
@hourly | Run once an hour, "0 * * * *". |
時間指定の例
毎分
1 |
* * * * * echo "test" |
5分ごと
1 |
*/5 * * * * echo "test" |
1,4,7月の1日の0時
1 2 |
0 0 1 1,4,7 * echo "test" 0 0 1 Jan,Apr,Jul * echo "test" |
土日の0時
1 2 |
0 0 * * 6,7 echo "test" 0 0 * * Sat,Sun echo "test" |
crontabファイルの記述の仕方は
1 |
man 5 crontab |
で参照できます。
crontabファイルの作成・編集(-eオプション)
-eオプションを用いて、crontabファイルの作成・編集を行うことができます。crontabファイルはユーザーごとに管理されています。
コマンドを実行したらエディタが開かれます。エディタは環境変数EDITORで設定できます。
コマンド例
1 |
crontab -e |
現在のcrontabファイルを表示(-lオプション)
-lオプションを用いると、現在のcrontabファイルを表示できます。
コマンド例と実行結果
1 2 3 4 |
$ crontab -l 0 0 1 1 * echo "test" 0 0 1 Jan,Apr,Jul * echo "test" 0 0 * * Sat,Sun echo "test" |
crontabファイルの削除(-rオプション)
-rオプションを用いると、crontabファイルを削除できます
コマンド例と実行結果
1 2 3 4 5 6 7 8 |
$ crontab -l 0 0 1 1 * echo "test" 0 0 1 Jan,Apr,Jul * echo "test" 0 0 * * Sat,Sun echo "test" $ $ crontab -r $ crontab -l no crontab for ubuntu |
crontabファイルの削除時に確認ダイアログを出す(-iオプション)
-iオプションを用いると、crontabファイルの削除時に確認ダイアログを出すことができます。
コマンド例と実行結果
1 2 3 4 |
$ crontab -i -r crontab: really delete ubuntu's crontab? (y/n) y $ crontab -l no crontab for ubuntu |
指定したcrontabファイルのインストール(オプションなし)
crontabコマンドをオプションなしで用いると、引数にしたファイルをcrontabファイルとしてインストールできます。
コマンド例と実行結果
1 2 3 4 5 6 |
$ cat mycronfile 0 0 1 1 0 echo 'test mycronfile' $ $ crontab mycronfile $ crontab -l 0 0 1 1 0 echo 'test mycronfile' |
crontab -lと組み合わせるとsedコマンド等を用いた編集に利用できます。
1 2 3 4 5 6 7 8 |
$ crontab -l 0 0 1 1 0 echo 'test mycronfile' $ crontab -l | sed 's/0/1/' 1 0 1 1 0 echo 'test mycronfile' $ $ crontab -l | sed 's/0/1/' | crontab - $ crontab -l 1 0 1 1 0 echo 'test mycronfile' |
ただし、crontabファイルが置き換わるため、sedコマンド等が間違えていたら、現在のcrontabファイルが消える可能性があるので、このような編集を行う場合は予めバックアップファイルを作成しておいたほうが良いでしょう。
別のユーザーを指定(-uオプション)
管理者権限があれば、-uオプションを用いて別のユーザーのcrontabファイルを指定できます。
1 2 3 4 |
$ whoami ubuntu $ sudo crontab -u ubuntu2 -l 0 0 1 1 * echo ubuntu2 test |
システムcrontabファイル
/etc/crontabはシステムcrontabファイルになります。このファイルは直接エディタ等で編集を行います。
編集後はcronデーモンによってファイルが監視されているため、ファイルに新しい更新があった場合は自動的に更新内容が取り込まれます。
また、システムcrontabファイルではユーザーも指定することになります。
1 2 3 4 5 6 7 8 |
$ cat /etc/crontab | sed '/^#/d' SHELL=/bin/sh 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.daily; } 47 6 * * 7 root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.weekly; } 52 6 1 * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.monthly; } |
詳しくは
1 2 |
man 8 cron man 5 crontab |
を参照してください。
cronデーモンで実行されたコマンドの標準出力
cronデーモンで実行されたコマンドの標準出力はシステムに設定されているメールに出力されます。
ここではローカル環境でそのメールを確認するためにpostfixとmuttをインストールして確認してみます。
postfixはメールサーバで、ここではpostfixの設定については省略します。
muttはコマンドラインインターフェースで利用できるテキストベースのメールクライアントになります。
インストールコマンドの例
1 2 |
sudo apt install postfix sudo apt install mutt |
crontabで以下のような内容のcrontabファイルを作成します。メールの宛先のubuntuの部分はユーザー名になっています。
1 2 3 |
MAILTO=ubuntu@localhost */5 * * * * echo "mail test" |
crontabのコマンドが実行されたかは/var/log/syslogで確認ができます。
1 |
tail -f /var/log/syslog |
メールが送信されたらmuttでメールを確認できます。例えば、以下のような内容のメールが届きます。
1 2 3 4 5 6 |
Date: Thu, 6 Jul 2023 08:30:03 +0900 (JST) From: Cron Daemon <root@ubuntu-VirtualBox> To: ubuntu@localhost Subject: Cron <ubuntu@ubuntu-VirtualBox> echo "mail test" mail test |
また、cronデーモンの標準機能でメール送信を行わずにsendmailコマンド等のコマンドを用いてメールを送る方法もあります。
そうすると、メールの題名等を制御できます。例えば、crontabファイルを以下のように書き換えてみます。
1 2 3 |
MAILTO="" */5 * * * * echo "mail test" | sed '1i Subject: test\n' | sendmail -f 'ubuntu@localhost' 'ubuntu@localhost' |
ここで、sedコマンドはメールの題名を挿入しています。また、sendmailコマンドについては
1 |
sendmail -f <送信元> <送信先> |
のように指定して利用しています。
メールが送信されたらmuttでメールを確認できます。例えば、以下のような内容のメールが届きます。
1 2 3 4 5 |
Date: Thu, 6 Jul 2023 09:50:01 +0900 (JST) From: ubuntu <ubuntu@localhost> Subject: test mail test |
最後に、ここでのメール送信はローカル環境でのcronデーモンを用いたメールの送信テストとして利用しているため、実用的かどうかはご自身で判断してもらえると幸いです。