第39章 自動タスク
Linux では、タスクは指定された期間、指定した日付、またはシステムの負荷平均が指定された数を下回る場合に、自動的に実行されるように設定できます。Red Hat Enterprise Linux は、システムを最新の状態に保つために重要なシステムタスクを実行するように事前設定されています。たとえば、locate コマンドで使用される場所のデータベースは毎日更新されます。システム管理者は、自動化されたタスクを使用して、定期的なバックアップの実行、システムの監視、カスタムスクリプトの実行などを行うことができます。
Red Hat Enterprise Linux には、いくつかの自動タスクユーティリティーが同梱されています。cron、at、および batch です。
39.1. Cron
Cron は、時間、月、曜日、および週の組み合わせに従って繰り返しジョブの実行をスケジュールするために使用できるデーモンです。
cron は、システムが継続的にオンであると想定しています。ジョブのスケジュール時にシステムがオンになっていない場合は、実行されません。1 回限りのジョブをスケジュールするには、「at および Batch」 を参照してください。
cron サービスを使用するには、
vixie-cron
RPM パッケージがインストールされ、crond サービスが実行されている必要があります。パッケージがインストールされているかを確認するには、rpm -q vixie-cron コマンドを使用します。サービスが実行されているかどうかを確認するには、コマンド /sbin/service crond status を使用します。
39.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 までの整数時間
- 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 つの特定の整数を示します。
スラッシュ(/)を使用して、ステップの値を指定できます。
/<integer>
で範囲に従うと、整数値は範囲内でスキップできます。たとえば、0-59/2
を使用して、分フィールドで他のすべての分を定義できます。ステップ値はアスタリスクと併用することもできます。たとえば、月のフィールドに */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
と同じ構文を使用します。例については、例39.1「/etc/crontab の例」 を参照してください。
例39.1 /etc/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 ジョブを設定できます。ユーザー定義の crontab はすべて
/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 ファイルを変更した場合は、デーモンを再起動する必要はありません。
Cron ジョブはランダム間隔で実行できます。これは、ネットワークのオーバーロードを防ぐために高負荷の共有ネットワークに役立ちます。ジョブのランダム化はデフォルトで無効になっていますが、以下のパラメーターを指定して
/etc/sysconfig/run-parts
ファイルで設定することができます。
RANDOMIZE
:1
に設定すると、ランダム化機能が有効になります。0
に設定すると、cron ジョブのランダム化は無効になります。RANDOM
- 初期ランダムシードを指定します。1
以上の整数値に設定する必要があります。RANDOMTIME
:1
以上の整数値に設定すると、追加のランダム化レベルが提供されます。
例39.2 /etc/sysconfig/run-parts の例 - Job Randomization の設定
RANDOMIZE=1 RANDOM=4 RANDOMTIME=8
39.1.2. Cron へのアクセスの制御
/etc/cron.allow
ファイルおよび /etc/cron.deny
ファイルは、cron へのアクセスを制限するために使用されます。両方のアクセス制御ファイルの形式は、各行の 1 つのユーザー名です。空白はいずれのファイルでも許可されません。アクセス制御ファイルが変更された場合、cron デーモン(crond)を再起動する必要はありません。アクセス制御ファイルは、ユーザーが cron ジョブの追加または削除を試みるたびに読み込まれます。
root ユーザーは、アクセス制御ファイルにリストされているユーザー名に関係なく、常に cron を使用できます。
cron.allow
ファイルが存在する場合は、そこに記載されているユーザーのみが cron を使用でき、cron.deny
ファイルは無視されます。
cron.allow
が存在しない場合は、cron.deny
に記載されているユーザーは cron を使用できません。
39.1.3. サービスの起動と停止
cron サービスを起動するには、コマンド /sbin/service crond start を使用します。サービスを停止するには、コマンド /sbin/service crond stop を使用します。システムの起動時に サービスを開始することが推奨されます。システムの起動時に cron サービスを自動的に開始する方法は、18章 を参照してください。