今号では、cron によるタスクの定期実行について、その仕組みや設定方法について説明します!
cron とは
cron とは、指定した時間、曜日、日付に自動でコマンドを実行してくれるデーモンの名称です。
デフォルトでもいくつかの操作が cron ジョブにより実行されるようになっており、具体的な実行内容などは設定ファイルに記述されています。
(例:logrotate の実行、特定パッケージの自動更新など)
cron デーモンが常駐し、毎分設定ファイルをチェックして「実行時間が来たか?」を確認しています。
cron の設定ファイル、ディレクトリの配置場所
cron は下記のファイル、ディレクトリにて設定ファイルが配置されます。
まずはファイルやディレクトリの種類、役割について見ていきましょう。
(※今回は RHEL8 の環境を前提に説明します)
1. /etc/crontab
システム全体の cron ジョブを設定するためのファイル。
システム管理者 (root) のみが編集できます。
(※ 通常は、このファイルを直接編集しません)
2. /etc/cron.d
システム全体の cron ジョブを設定するためのファイル。
/etc/crontab ではなく、このディレクトリ配下にファイルを配置することが一般的です。
3. /etc/cron.hourly
毎時 (1時間ごと) 実行される設定ファイル (スクリプト) を配置するディレクトリ。
4. /etc/cron.daily
毎日 (1日ごと) 実行される設定ファイル (スクリプト) を配置するディレクトリ。
5. /etc/cron.weekly
毎週 (1週間ごと) 実行される設定ファイル (スクリプト) を配置するディレクトリ。
6. /etc/cron.monthly
毎月 (1ヵ月ごと) 実行される設定ファイル (スクリプト) を配置するディレクトリ。
7. /var/spool/cron
ユーザごとの個別の設定ファイル (crontab) を配置するディレクトリ。
後述する crontab コマンドでタスクを作成すると、このディレクトリ配下に設定ファイルが作成されます。
cron ジョブの設定方法 (時間指定)
cron によるタスクを作成するには、下記の 2通りの方法があります。
- crontab コマンドで設定する (ユーザごとの個別の設定)
- /etc/cron.d 配下に設定ファイルを配置する (システム全体の設定)
それぞれの手順を説明します。
crontab コマンドで設定する (ユーザごとの個別の設定)
各ユーザごとに、現在どのような cron のタスクが設定されているかを確認するには
crontab -l コマンドを実行します。
デフォルトでは何も登録されていないため、下記のような表示になります。
$ crontab -l no crontab for ykaino
cron のタスクを追加、編集するには crontab -e コマンドを実行します。
テキストエディタが開きます。
cron は、分、時、日、月、曜日の 5つのフィールドで実行タイミングを指定します。
* * * * * コマンド
- 例1:毎日 0時に実行:0 0 * * *
- 例2:毎週月曜日の朝 6時に実行:0 6 * * 1
- 例3:毎分実行:* * * * *
[補足] 曜日フィールドについて
cron では、曜日を 0 から 7 までの数値で指定します。
- 0:日曜日 (Sunday)
- 1:月曜日 (Monday)
- 2:火曜日 (Tuesday)
- 3:水曜日 (Wednesday)
- 4:木曜日 (Thursday)
- 5:金曜日 (Friday)
- 6:土曜日 (Saturday)
- 7:日曜日 (Sunday)
※ 日曜日は 0 と 7、どちらを使用してもよいですが、一般的には 0 が使用されることが多いです。
例えば、決まった時間に特定のスクリプトを動作させたい場合、下記のように設定し、保存 ([:w]、もしくは[ZZ]) します。
30 7 * * * /path/to/myscript.sh
※スクリプトは絶対パスで指定しておくと確実です。
なお、crontab -e でタスクを追加後 crontab -l を再度実行してみると、下記のようにタスクが追加されていることが分かります。
$ crontab -l 30 7 * * * /path/to/myscript.sh
/etc/cron.d 配下に設定ファイルを配置する (システム全体の設定)
システム全体に適用されるタスクを追加したい場合、crontab コマンドではなく /etc/cron.d 配下に直接ファイルを作成します。
タスクの設定方法は、crontab コマンドで実施した方法と同じです。
例えば、上の例でも出した myscript.sh をシステム全体で適用したい場合、下記のように設定します。
# cat /etc/cron.d/myscript 30 7 * * * /path/to/myscript.sh
なお、設定ファイル追加後は cron を再起動しなくてもタスクが適用されます。
cron ジョブの設定方法 (スクリプト)
cron のタスクは、時間指定する方法だけでなくスクリプト形式でも登録することができます。
単純なコマンド実行だけでなく、処理を分岐させたい場合や、より複雑な処理が必要な場合はスクリプト形式での登録が有用です。
例として、デフォルトで配置されている /etc/cron.daily/logrotate の内容を見てみます。
1 #!/bin/sh 2 3 /usr/sbin/logrotate /etc/logrotate.conf 4 EXITVALUE=$? 5 if [ $EXITVALUE != 0 ]; then 6 /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" 7 fi 8 exit $EXITVALUE
- 3行目
logrotate コマンド (/usr/sbin/logrotate) が logrotate の設定ファイル (/etc/logrotate.conf) を読み込みます。 - 4行目
直前に実行されたコマンド (ここでは logrotate コマンド) の 終了ステータス を EXITVALUE に格納します。 - 5~7行目
EXITVALUE が 0 以外 (つまり logrotate がエラーで終了) の場合、ログにエラーを示す旨のメッセージを書き込む処理を実行します。 - 8行目
スクリプトの終了ステータスを EXITVALUE と同じ値に設定します。
次号について
次号では、cron タスクを追加する際の tips や、スクリプト形式のタスクについてもう少し詳しく説明します!