定期的にプログラムを実行する方法を説明します。

Linuxでは”cron”というソフトウェアが定期実行を管理しています。 自分で書いたスクリプトなどを定期的に実行させることができるので便利です。 仕組みと利用法を見てみましょう。 なお、当ポストはRedHat系の利用を前提としていますが、ディレクトリ構成を除いてDebian系などでも同様に使えます。

cronとは

cronとは、定期実行を管理するソフトウェアの名前です。 定期実行したいプログラムの一覧を保持したり、定期的に指定されたプログラムを実行する機能を持っています。

プログラムを実行する際に問題となるのは、実行権限です。 cronそのものの実行権限でしかプログラムを動かせないとroot権限下のファイルなどを読み書きできなくなってしまいますが、それでは困ります。 そこでcronでは実行するプログラム名の他に実行権限などの情報を事前に与えることになっています。 以下の表にcronに与える必要のある情報をまとめました。

名前 説明
分(minute) 時刻を指定 / 間隔を指定 20(20分), */20(20分ごと), *(毎分)
時(hour) 時刻を指定 / 間隔を指定 3(3時), */2(2時間ごと), *(毎時)
日付(date) 日にちを指定 / 間隔を指定 13(13日), */2(2日ごと), *(毎日)
月(month) 月を指定 / 間隔を指定 1(1月), */2(2ヶ月ごと), *(毎月)
曜日(day) 曜日を指定 sun(日曜日),*(毎日)
実行権限 ユーザ名を指定する root, apache
プログラム名 コマンドラインに入力するのと同じ要領で与える ”/usr/local/bin/hoge -c -s”など

設定ファイル

定期実行に関するデータは以下の2カ所に保存されています。 crontabは直接ユーザが編集するタイプの場所ですが、spool下のファイルはcrontabコマンドから編集するものなので一般にはいじらなものです。

  • /var/spool/cron/(ユーザ名)
  • /etc/crontab

それでは/etc/crontabファイルを見てみましょう。

$ cat /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
30 2 * * * root /usr/local/sbin/backup 1>/dev/null

最後の1行が私が追加しているものです。この場合、「毎日2時30分にroot権限でbackupコマンドを実行」します。

cronサービスの起動

cronはサービスなので、起動していることを確認しましょう。

// RHEL7以降
$ systemctl status cron
$ systemctl status cron //起動していない場合
// RHEL6以前
$ service cron status
$ service cron status //起動していない場合

cronの設定

### 編集 基本的にはすべてcrontabコマンドを利用します。ユーザ”hoge”のcrontabを編集する場合、以下のコマンドを実行します。vimが起動して編集出来るようになります。終了時には文法チェックが行われるようです。

# crontab -e -u hoge

一覧の表示

ユーザ”hoge”のcrontab内容は以下のコマンドで分かります。ユーザを指定していない場合、ログイン中のユーザ情報を表示します。

# crontab -u hoge -l