Last Modiffied: 22 Mar 2004
cron の設定ガイド

1.はじめに

■はじめに

cron とは、ジョブ(スクリプト)を自動実行するためのデーモンプロセスです。そして、Linux システムの管理を行なう場合、ログのローテートや、バックアップなど、定期的に自動実行したいジョブが数多くあります。特に、バックアップなどは、システムへの負荷が大きいため、通常は、ユーザからのアクセスが少ない、深夜や早朝に行なわれます。

このように、定期的に実行されるジョブは、crond というデーモンによって、自動的に行なうように管理することができます。そこで、今回は、cron の設定を行なうために必要なコマンドや、設定ファイルについて説明していきたいと思います。



2.設定手順など

■設定手順

このページでは、以下の順番で cronの設定について説明します。

まず、Linuxシステム上で、cron を使用するために、サービスの起動で、サービスの状態を確認し、停止している場合には、サービスを起動します。

次に、cronの設定を行なうために必要な、コマンドの使用方法と、設定ファイル(/var/spool/cron/userについて説明します。さらに、「/etc/crontab」ファイルから呼ばれるディレクトリでの設定について説明します。

そして、crontabコマンドの使用を制限する方法をアクセス制限で説明し、最後に、簡単な設定例を紹介してcronの設定方法についての説明を終わります。


■その他

このページは、crontab の man ページを参考に、cronの基本的な設定方法についてのみ説明を行ないます。このページで説明していない内容については、以下のコマンドを実行して crontab の man ページを参照したり、Internetで検索するなどして使用して下さい。
# man 5 crontab



3.準備

■サービスの起動

cron を使用するためには、crond が起動していなくてはいけません。通常は、インストール時にサービスが自動起動するように設定されていますが、以下のコマンドで、crond の状態を確認します。
# /etc/rc.d/init.d/crond status
crond (pid xxx) を実行中...
もし、crond が起動していなかった場合には、crond を手動で起動し、以後、OS起動時にcrond が自動起動するように設定します。
# /etc/rc.d/init.d/crond start
crondを起動中:
# chkconfig --level 2345 crond on     ・・・(注1)
# chkconfig --list crond              ・・・(注2)
crond     0:オフ  1:オフ  2:オン  3:オン  4:オン  5:オン  6:オフ
注1 runlevel 2,3,4,5 で cron を起動
注2 設定の確認


■cronの設定ファイル

cronの設定ファイルは、以下の表の通りです。crond は、毎分、以下の設定ファイルの内容に変更がないかを確認し、変更があった場合には、それを反映して実行します。

ファイル/ディレクトリ名利用者主な用途
/var/spool/cron/user全ユーザユーザの自動タスク設定ファイル
/etc/crontabroot毎時、毎日、毎月、毎週の自動タスクのメイン設定ファイル
/etc/cron.hourlyroot毎時実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.dailyroot毎日実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.monthlyroot毎月実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.weeklyroot毎週実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.droot上記以外の自動タスク設定ファイルを置くディレクトリ


■crontabコマンドの書式

crontabファイルは、cron を操作する際に作成し、プロセスを定期的に実行するためのファイルで、crontabコマンドで作成します。書式は、以下の通りです。

# crontab [- u user] {-l|-r|-e}
なお、指定可能なオプションについては、下の表を参照して下さい。

オプション
-e crontabを対話的に編集します。通常は、viエディタが起動して、設定ファイルの編集を行ないます。
-l crontabファイルの内容を表示します。
-r crontabファイルを削除します。
-u user userで指定したユーザのcrontabファイルを操作の対象とします。なお、このオプションは、rootユーザのみ使用できます。


■crontabコマンドの使用例

以下に、crontabコマンドの使用例を紹介します。

rootユーザが、testユーザの crontabファイルを表示する場合。
# crontab -l -u test
自分自身の crontabファイルを編集する場合。
$ crontab -e



4.設定ファイル(/var/spool/cron/user

■「/var/spool/cron/user」 ファイルの書式

crontabファイルでは、crond への命令を、「この日付のこの時刻に、このコマンドを実行して下さい。」といった形式で書き込みます。そして、ユーザは、それぞれのcrontabファイルを「/var/spool/cron」配下にuser という名前で所有しており、使用するコマンドは、そのcrontabファイルを所有しているユーザの権限で実行されるので、コマンド使用の際には注意が必要です。

また、このファイルの中は、おおまかに、コメント行、環境変数の設定、cronコマンドの実行、のいずれかに分けることができ、その内容を記述します。なお、コメント行は、通常のファイルと同様に、先頭に '#' を書きます。

なお、このファイルの作成/編集は、 'crontab -e' とコマンドを実行して行ないます。


■環境変数の設定

環境変数は、以下の形式で設定を行ないます。
環境変数名 = 値
環境変数のいくつかは、crond によって自動的に設定されます。具体的には、SHELLは、「/bin/sh」に設定され、LOGNAMEとHOMEは、「/etc/passwd」のcrontabの所有者の行を参照して設定されます。ただし、自動的に設定された、SHELLとHOMEの値は、crontabファイルの記述で変更することができます。

また、crontabの実行結果をメールで通知するために、MAILTOを指定することもできます。

MAILTO = user

user には、crontabの実行結果を送信するユーザを登録します。メールの送信先を複数指定する場合には、 user を ','(カンマ) で区切って指定します。user を登録せず、環境変数、MAILTOのみを指定した場合(MAILTO='' または MAILTO="" と指定)、メールを送信しない設定になります。なお、MAILTOが記述されない場合には、crontabファイルの所有者宛に、crontabの実行結果を通知するメールが送信されます。


■cron コマンドの設定

crontabファイルで、cron コマンドの実行を記述する行は、6つのフィールドで形成されており(システムの crontabファイル(/etc/crontab)は、7つ(分、時、日、月、曜日、ユーザ名、コマンド))、コマンドの実行時間をさまざまな形式で指定することが出来ます。具体的には、以下の通りで、設定可能な値については、(表1)を参照して下さい。

なお、初めてcrontabファイルを編集した場合には、何も書かれていませんので、以下のフォーマットで記述します。また、各フィールドでは、 '*' を使用することが可能です。
 分 時 日 月 曜日 コマンド
表1
0〜59
0〜23
1〜31
1〜12 or jan〜dec
曜日0〜7 [0,7は日曜日] or sun〜sat
コマンド有効なコマンドを記述します。空白を含むことも可能ですが、標準のBourne Shellの書式に従って記述します。


また、crontabファイルでは、リスト範囲の指定を行なうことができます。リストとは、一つのフィールドに対して、複数の値を設定することで、範囲とは、一つのフィールドに対して、特定の範囲の値を設定することです。そして、リストと範囲は、一つのフィールドに共存することもできます。さらに、間隔値(指定間隔に一度、処理を実行)を設定することもできます。

表2
設定例 コメント
リスト 0,15,30,45 分フィールドで指定した場合、15分に一度処理を実行します。
範囲 1-5 曜日フィールドで指定した場合、月曜日〜金曜日に処理を実行します。
共存 1,3,7-9 時間フィールドで指定した場合、1時、3時、7時、8時、9時に処理を実行します。
間隔値 1-5/2 時間フィールドで指定した場合、1時、3時、5時に処理を実行します。なお、間隔値は、「/」の後ろに指定した値の間隔で処理を実行します。




5.設定ファイル(/etc/crontab)

■「/etc/crontab」

通常、このファイルには、以下のように、「cron.monthly」、「cron.weekly」、「cron.daily」、「cron.hourly」配下のファイルが、指定時間ごとに実行されるように設定されています。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg
このファイルも、「/var/spool/cron/user」ファイルと同様に、コメント行、環境変数の設定、cronコマンドの実行の3つで形成されますが、cronコマンドの実行を設定する行の書式が若干異なっています。

具体的には、「3.crontabファイル」の 「■cron コマンドの設定」 のところでも簡単にふれましたが、このファイルを直接編集する場合には、ユーザフィールドが追加され、以下のように、7つのフィールドで形成されます。
 分 時 日 月 曜日 ユーザ コマンド
ただし、RedHat系の Linuxでは、このファイルを直接編集することは推奨されていないため、定期的に実行したいコマンドについては「cron.monthly」、「cron.weekly」、「cron.daily」、「cron.hourly」配下のファイル、または、crontabコマンドを用いて、「/var/spool/cron/user」ファイルに設定を行ないます。


■「/etc/cron.monthly、cron.weekly、cron.daily、cron.hourly」

上述の通り、これらのディレクトリは、「/etc/crontab」ファイルによって呼び出され、指定時間ごとに、配下にあるシェルスクリプトを実行します。

例えば、「/etc/cron.daily/logrotate」ファイルには、以下のように設定されています。
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf
これらのディレクトリに、作成したシェルスクリプトを保存し、実行権を付与します。ここで、実行権を与えないと、作成したシェルスクリプトが実行されませんので、特に注意が必要です。
# chmod 755 /etc/cron.daily/logrotate
なお、これらのディレクトリに保存したシェルスクリプトは、時間をカスタマイズして実行することができませんので、任意の時間にジョブを実行したい場合には、crontabコマンドを使用して、「/var/spool/cron/user」ファイルに設定します。



6.アクセス制御

■アクセス制御

cron は、デフォルトの状態では、すべてのユーザが使用することができますが、使用を制限することも可能です。方法は、使用を許可したい場合には、「/etc/cron.allow」ファイルを作成し、1行に1ユーザを記述します。反対に、使用を許可したくない場合には、「/etc/cron.deny」ファイルを作成し、1行に1ユーザを記述します。以下に、「hoge」というユーザのみ使用を許可する場合の、「/etc/cron.allow」ファイルの設定を紹介します。
# vi /etc/cron.allow
hoge
なお、「/etc/cron.allow」「/etc/cron.deny」の有無によって cron を使用できるユーザが異なります。例えば、両方のファイルが存在しない場合には、全ユーザが crontabコマンド を使用でき、「/etc/cron.allow」が存在する場合には、「/etc/cron.deny」が存在しても、設定内容は無視され、「/etc/cron.allow」に登録されたユーザのみが使用できます。

詳細については、以下の表を参照して下さい。

cron.allowcron.deny使用可能ユーザ
なしなし全ユーザ
あり無視cron.allow に登録されているユーザ
なしありcron.deny に登録されていないユーザ
無視なし
なし全ユーザ

あり:ファイルあり、なし:ファイルなし、空:ファイルサイズ0、無視:ファイルを無視




7.設定例

■設定例

最後に、crontab の man ページに記載されているファイルの内容を紹介します。
# man 5 crontab

CRON ファイルの例
# (/etc/passwd の指定に関らず) コマンド実行に /bin/sh を使用する。
SHELL=/bin/sh
# (この crontabの所有者に関らず) あらゆる出力を `paul' にメールする。
MAILTO=paul
#
# 毎日、日付変更の 5 分後に実行する
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# 毎月初日の 2:15pm に実行する  出力は paul にメールされる
15 14 1 * *     $HOME/bin/monthly
# 週末の午後 10 時に実行してジョーを心配させる
0 22 * * 15 mail s "午後10時だ" joe%ジョー、%%お前の子どもはどこだい?%
23 023/2 * * * echo "毎日 0,2,4..時 23 分に実行する"
5 4 * * sun     echo "日曜 4 時 5 分に実行する"



8.改版履歴

■改版履歴

2002/03/22 初版作成



8.参考

■Linux動作確認情報

Express5800シリーズ Linux OSの動作確認情報 公開中






BACKUP