Linuxで、cronを使用して定期的にジョブを実行するには「etc/crontab」「/etc/cron.d/以下のファイル」「各ユーザのcrontabファイル」のいずれかにジョブを設定します。
そこでここでは、Redhat互換のLinuxで「etc/crontab」にジョブを設定する方法や、ジョブの実行結果を分かりやすくメール通知させる方法を紹介します。
この記事は、以下の環境での動作結果を基にしています。他のディストリビューションやバージョンでは、動作結果が異なる場合があることをご了承ください。
ソフトウェア | バージョン |
---|---|
CentOS Linux | 7.9.2009 |
目次
cronジョブの設定
「/etc/crontab」にジョブを設定するときは、viなどのテキストエディタで「etc/crontab」を開きます。
# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
* * * * * nginx /usr/bin/php -q /usr/share/nginx/servermemo/wordpress/wp-cron.php >/dev/null
上3行は、環境変数の設定部分です。「MAILTO」を設定するとcronの標準出⼒・標準エラー出力を、指定の宛先へメールで送ることができます。
ジョブの登録方法
新たなジョブを登録する際は、上記のように最終行に追記します。
書式:[分] [時] [⽇] [⽉] [曜⽇] [ユーザー名][コマンド]
設定項目 | 説明 |
---|---|
分 | 0~59の数字で指定します。 |
時 | 0~23の数字で指定します。 |
日 | 1~31の数字で指定します。 |
月 | 1~12の数字で指定します。 |
曜日 | 数字で指定します。0と7が日曜日で1以降は順に月~土となります。 |
ユーザー名 | コマンドを実行するユーザーを指定します。 |
コマンド | フルパスで指定します。 |
実行周期の記述例
実行周期の記述方法は、いろいろあるので以下を参考にしてみてください。
記述 | 説明 |
---|---|
* * * * * | 毎分実行 |
0 * * * * | 毎時0分に実行 |
*/10 * * * * | 10分おきに実行 |
0 12 * * * | 毎日12:00に実行 |
45 23 * * * | 毎日23:45に実行 |
30 8 * * * | 毎日8:30に実行 |
* 1 * * * | 毎日1:00から1:59まで1分おきに実行 |
5 9-21/3 * * * | 毎日9:05,12:05,15:05,18:05,21:05に実行 |
0 17 * * 1 | 毎週月曜の17:00に実行 |
0,30 15 * * 0,2,3 | 毎週日,火,水曜の15:00と15:30に実行 |
0 21 * * 1-6 | 毎週月曜日から土曜まで21:00に実行 |
0 13 1 * * | 毎月1日の13:00に実行 |
30 5 1,15 * * | 毎月1日と15日の5:30に実行 |
0-10 17 1 * * | 毎月1日の17:00から17:10まで1分おきに実行 |
動作確認
登録したジョブの実行結果は、ログファイル「/var/log/cron」に記録されるので、新しいジョブを登録したら、指定した周期でジョブが実行されているかログを確認しましょう。
ジョブの実行結果メールをカスタマイズ
cronでは、ジョブに設定したスクリプトなどの標準出⼒・標準エラー出力を指定の宛先へメールで送ることができますが、デフォルトの通知メールではメールの本文を確認しないと状況がよくわからず使いづらく感じるときがあります。
そのようなときは、以下のようにmailコマンドとスクリプトを組み合わせて実行させることで、メールの件名だけでジョブの実行結果を判断できるようにできます。
# MSG=`/home/hoge/scripts/myscript.sh`; (if [ -n "$MSG" ]; then (echo $MSG | mail -s 'NOTICE : Something went wrong.' admin@yourdomain.com) fi)
上のコマンドの処理の流れは、以下のとおりです。
MSG=`/home/hoge/scripts/myscript.sh`
スクリプト「myscript.sh」の戻り値を、変数「MSG」に代入しています。
if [ -n "$MSG" ]; then
変数「MSG」の文字列長が0より大きい場合に、指定した処理(メール送信)を行います。
なお、if文での条件判定は、実行するスクリプトが返す値によって適宜修正してください。
echo $MSG | mail -s 'NOTICE : Something went wrong.' admin@yourdomain.com
以下の内容でメールを送信します。
- 件名:NOTICE : Something went wrong.
- 宛先:admin@yourdomain.com
- 本文:変数MSGの内容
cronから日に何通もメールが来るのであれば、ここで紹介した方法でメールの件名などを分かりやすくするなどしておけば、いちいち本文を見なくても件名を見ただけで状況を把握できるといった効率化を測れるでしょう。
あとがき
ちなみに、CentOS 7ではジョブのスケジュール実行手段としてcron以外に「systemd timer」もあります。