第 28章自動化タスク

Linuxのタスクは、指定された所定の時間内や、指定の日付に、又はシステムの平均負荷が指定した値以下の場合に自動的に実行するような設定が可能です。Red Hat Linuxは、システムを常に最新の状態に保つための重要なシステムタスクを実行するようにあらかじめ設定がされています。たとえば、locateコマンドにより使用されるslocateデータベースは毎日更新されます。システム管理者は自動化タスクによって、定期的なバックアップ、システムのモニタ、カスタムスクリプトの実行などが行えます。

Red Hat Linux には次の4種類の自動タスクユーティリティが用意されています。これらのユーティリティは、cronanacronatbatchです。

28.1. Cron

Cronは、繰り返し行われるタスクを実行するためのデーモンで、時刻、日付、月、曜日、週の組み合わせに従ってタスクを実行します。

Cronは、システムが継続して稼動していることを前提としています。タスクの実行予定時にシステムが稼動中でない場合、タスクは実行されません。特定の時刻ではなく、期間に基づきタスクを実行するよう構成する方法については、項28.2を参照してください。1回きりのタスクをスケジュールする方法については、項28.3を参照してください。

cronサービスを使用するには、vixie-cronRPMパッケージがインストールされ、crondサービスが実行されている必要があります。このパッケージがインストールされていることを確認するには、rpm -q vixie-cronコマンドを使用してください。このサービスが実行されていることを確認するには、/sbin/service crond statusコマンドを使用してください。

28.1.1. cronタスクの設定

cronのメイン設定ファイル/etc/crontabにある次の行を使用して設定を行います。

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

最初の4行は、cronタスクを実行する環境変数の設定に使用します。SHELL変数の値は、使用するシェル環境(この例ではbashシェル)を指定し、PATH変数はコマンドの実行に使用するパスを定義します。cronタスクの出力は、MAILTO変数に定義されたユーザー名に電子メール送信されます。MAILTO変数に空の文字列が定義されている場合(MAILTO="")、電子メールは送信されません。HOME変数は、コマンドやスクリプトを実行する際に使用するホームディレクトリの設定に使用します。

/etc/crontabファイルの各行は1つのタスクを表し、次の形式をとります。

minute   hour   day   month   dayofweek   command

  • minute —0〜59の整数

  • hour —0〜23の整数

  • day —1〜31の整数(月を指定した場合はその月にある日付)

  • month —1〜12の整数(またはjanやfebなど月の短縮名)

  • dayofweek — 0〜7の整数。 0や7は日曜を表す(またはsunやmonなど曜日の短縮名)

  • command — 実行するコマンド (コマンドは、ls /proc >> /tmp/procのようなコマンドにするか、ユーザーが作成したカスタムスクリプトを実行するコマンドのいずれかにすることができます)

上記のいずれの値についても、アスタリスク(*)を使用すると、すべての有効な値が指定されます。たとえば、月の値にアスタリスクを使用すると、コマンドはその他の値による制約の範囲内で毎月実行されます。

整数間にハイフン(-)を使用すると、整数の範囲を指定できます。たとえば、1-4は、整数1、2、3、4を表します。

値をカンマ(,)で区切ると、値の一覧を指定できます。たとえば、3, 4, 6, 8はこれら4つの値を指定します。

スラッシュ(/)を使用すると、ステップ値を指定できます。範囲に/<integer>を付けると、範囲内でその整数の値をスキップできます。たとえば0-59/2とした場合、分フィールドにおける1分おきの間隔が定義されます。ステップ値は、アスタリスクと組み合わせることも可能です。たとえば、値*/3を月フィールドで使用すると、3ヶ月ごとにタスクが実行されます。

先頭がシャープ記号(#)の行はコメント行で処理の対象外です。

/etc/crontabファイルが示すように、これはrun-partsスクリプトを使用して/etc/cron.hourly/etc/cron.daily/etc/cron.weekly/etc/cron.monthlyディレクトリのスクリプトをそれぞれ毎時間、毎日、毎週、毎月実行します。これらディレクトリにあるファイルは、シェルスクリプトである必要があります。

cronタスクを毎時間、毎日、毎週、毎月設定以外の予定で実行する必要がある場合、それを /etc/cron.dディレクトリに追加することが出来ます。このディレクトリ内の ファイルは全て/etc/crontabと同じ構文を使用します。その例に ついては、例28-1を参照して下さい。

# record the memory usage of the system every monday 
# at 3:30AM in the file /tmp/meminfo
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
# run custom script the first day of every month at 4:10AM
10 4 1 * * /root/scripts/backup.sh

例 28-1. crontabの例

root以外のユーザーがcronタスクを設定するには、crontabユーティリティを使用します。ユーザー定義のcrontabはいずれも/var/spool/cronディレクトリに保存され、これを作成したユーザーのユーザー名を使用して実行されます。ユーザーとしてcrontabを作成するには、そのユーザーとしてログインし、crontab -eコマンドを入力してユーザー定義のcrontabを編集します。これには、VISUALEDITOR環境変数で指定したエディタを使用します。このファイルの形式は、/etc/crontabファイルと同じです。crontabの変更が保存されると、crontabはユーザー名に従って保存され、ファイル/var/spool/cron/usernameに書き込まれます。

cronデーモンは、etc/crontabファイル、etc/cron.d/ディレクトリ、/var/spool/cronディレクトリを毎分チェックして変更がないかを確認します。変更が見付かれば、メモリにロードされます。したがってcrontabファイルを変更した場合でもデーモンを再起動する必要はありません。

28.1.2. Cronに対するアクセスの制御

/etc/cron.allowファイルや/etc/cron.denyファイルは、cronへのアクセスを制限するために使用されます。どちらのアクセスコントロールファイルも、1行にユーザー名を1つという形式で記述されています。また、どちらのファイルでも空白文字は使えません。これらのアクセスコントロールファイルを変更したときに、cronデーモン(crond)を再起動する必要はありません。アクセスコントロールファイルはユーザーがcronタスクを追加したり、削除したりしようとするたびに読み込まれます。

アクセスコントロールファイルにリストされているユーザー名に関係なく、rootユーザーはいつでもcronを使用できます。

ファイルcron.allowが存在する場合、このファイルに記載されているユーザーだけがcronを使用することができます。このとき、at.denyファイルは無視されます。

cron.allowが存在しない場合、cron.denyに記載されているユーザーはすべて、cronを使用できません。

28.1.3. サービスの起動と停止

cronサービスを起動するには、/sbin/service crond startコマンドを使用します。サービスを停止するには、/sbin/service crond stopコマンドを使用します。サービスの起動はブート時に行うことをお勧めします。ブート時に自動的にcronサービスを起動する方法については、第14章を参照してください。