第34章 自動タスク
Linux では、タスクは、指定期間、指定された日付、またはシステムの負荷平均が指定された数を下回る場合に、自動的に実行するように設定できます。Red Hat Enterprise Linux は、システムの更新を維持するために重要なシステムタスクを実行するように事前設定されています。たとえば、locate コマンドで使用される s locate データベースが毎日更新されます。システム管理者は、自動化されたタスクを使用して定期的なバックアップの実行、システムの監視、カスタムスクリプトの実行などを実行できます。
Red Hat Enterprise Linux には、cron、at、batch などの自動タスクユーティリティーが複数含まれています。
34.1. Cron
Cron は、時間、月、曜日の組み合わせ、タスクの繰り返し実行をスケジュールするために使用できるデーモンです。
crons は、システムが継続的にあることを前提としています。タスクがスケジュールされている時にシステムがオンになっていない場合は、実行されません。1 回限りのタスクをスケジュールするには、「at および Batch」 を参照してください。
cron サービスを使用するには、
vixie-cron
RPM パッケージがインストールされ、crond サービスが実行している必要があります。パッケージがインストールされているかどうかを確認するには、rpm -q vixie-cron コマンドを使用します。サービスが実行中かどうかを確認するには、/sbin/service crond status コマンドを使用します。
34.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
ファイルの各行はタスクを表し、以下の形式となっています。
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 などのコマンドか、またはカスタムスクリプトを実行するコマンドになります)。
上記のいずれの値でも、アスタリスク(*)を使用して有効な値をすべて指定できます。たとえば、month 値のアスタリスクは、他の値の制約内で毎回コマンドを実行します。
整数間のハイフン(-)は整数の範囲を指定します。たとえば、
1-4
は整数の 1、2、3、および 4 を意味します。
コンマで区切られた値の一覧(,)はリストを指定します。たとえば、
3, 4, 6, 8
は 4 つの特定の整数を示します。
スラッシュ(/)を使用して step の値を指定できます。整数の値は、
/<integer>
の範囲に従って範囲内をスキップできます。たとえば、0-59/2
を使用すると、1 分ごとの分を 1 分単位で定義できます。ステップ値はアスタリスクでも使用することができます。たとえば、*/3
の値を月フィールドで使用することで、3 カ月ごとにタスクを実行できます。
ハッシュマーク(#)で始まる行はすべてコメントで、処理されません。
/etc/crontab
ファイルにあるように、run-parts スクリプトは、/etc/cron.hourly/
、/etc/cron.daily/
、/etc/cron.weekly/
、および /etc/cron.monthly/
ディレクトリーのスクリプトを実行します。これらのディレクトリーのファイルはシェルスクリプトである必要があります。
cron タスクを hourly、daily、weekly、または monthly 以外のスケジュールで実行する必要がある場合は、
/etc/cron.d/
ディレクトリーに追加できます。このディレクトリー内のすべてのファイルは、/etc/crontab
と同じ構文を使用します。例については、例34.1「crontab の例」 を参照してください。
例34.1 crontab の例
# 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
root 以外のユーザーは、crontab ユーティリティーを使用して cron タスクを設定できます。ユーザー定義の crontabs は
/var/spool/cron/
ディレクトリーに保存され、作成したユーザーのユーザー名を使用して実行されます。ユーザーとして crontab を作成するには、そのユーザーにログインし、crontab -e コマンドを入力して、VISUAL
または EDITOR
環境変数が指定したエディターを使用してユーザーの crontab を編集します。このファイルは、/etc/crontab
と同じ形式を使用します。crontab への変更が保存されると、crontab はユーザー名に従って保存され、/var/spool/cron/ユーザー名に書き込まれます
。
cron デーモンは、
/etc/crontab
ファイル、/etc/cron.d/
ディレクトリー、および /var/spool/cron/
ディレクトリーごとに変更の有無を確認します。変更が見つかった場合は、メモリーに読み込まれます。そのため、crontab ファイルを変更した場合でもデーモンを再起動する必要はありません。
34.1.2. cron へのアクセスの制御
cron へのアクセスを制限するには、
/etc/cron.allow
ファイルおよび /etc/cron.deny
ファイルが使用されます。両方のアクセス制御ファイルの形式は、1 行に 1 つのユーザー名です。いずれのファイルでも空白は許可されません。アクセス制御ファイルを変更した場合、cron デーモン(crond)を再起動する必要はありません。アクセス制御ファイルは、ユーザーが cron タスクの追加または削除を試みるたびに読み込まれます。
root ユーザーは、アクセス制御ファイルに記載されているユーザー名に関係なく、常に cron を使用できます。
cron.allow
ファイルが存在する場合は、それに一覧表示されているユーザーのみが cron を使用でき、cron.deny
ファイルは無視されます。
cron.allow
が存在しない場合は、cron.deny
に一覧表示されているユーザーは cron を使用することができません。
34.1.3. サービスの起動と停止
cron サービスを起動するには、/sbin/service crond start のコマンドを使用します。サービスを停止するには、/sbin/service crond stop コマンドを使用します。システムの起動時にサービスを開始することが推奨されます。起動時に cron サービスを自動的に起動する方法は、19章 を参照してください。