■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 と同じ値に設定する。