Show Table of Contents
第21章 システムタスクの自動化
ジョブ としても知られるタスクは、指定した期日に指定した期間だけ、またはシステムのロード平均が 0.8 を下回る時に、自動的に実行するように設定できます。
Red Hat Enterprise Linux は、システムを最新状態に保つために重要なシステムタスクを実行するように事前設定されています。例えば、
locate
コマンドで使用される slocate データベースは毎日更新されます。システム管理者は、この自動化タスクを使用して定期的なバックアップ、システムの監視、カスタムスクリプトの実行などの作業を実施することができます。
Red Hat Enterprise Linux は、
cron
、anacron
、at
、 batch
といった自動化タスクユーティリティを備えています。
ユーティリティはすべて、異なるジョブタイプのスケジュール管理を目的としています。Cron と Anacron は繰り返されるジョブのスケジュール管理をするのに対し、At と Batch は 1 回のみのジョブのスケジュール管理をします(「Cron と Anacron」 と 「At コマンドと Batch コマンド」 をそれぞれ参照してください)。
21.1. Cron と Anacron
Cron と Anacron はいずれも、時刻、月のうちの日付、月、曜日、週で定義されたある時点で定期的なタスクの実行をスケジュールすることができるデーモンです。
Cron は、最高で 1 分おきの頻度でジョブの実行が可能です。しかし、ユーティリティはシステムが継続的に稼働状態であることを前提としており、ジョブがスケジュールされている時にシステムが稼働していない場合は、ジョブは実行されません。
一方でAnacron は、ジョブがスケジュールされている時点でシステムが稼働していなくても、ジョブを記憶しています。そして、次回にシステムが立ち上がった時にジョブを実行します。しかし、Anacron は1日に1回しかジョブを実行できません。
21.1.1. Cron と Anacron のインストール
Cron と Anacron をインストールするには、Cron は cronie パッケージを、Anacron はcronie-anacron パッケージを (cronie-anacron は cronie のサブパッケージ) をインストールする必要があります。
システムにパッケージがインストール済みかどうかを確認するには、
rpm -q cronie cronie-anacron
コマンドを発行します。インストール済みの場合は、cronie および cronie-anacron パッケージの完全名が返されるか、パッケージが利用可能でないことを告げられます。
これらのパッケージをインスト-ルするには、以下の形式で
yum
コマンドを使用します。
yum
install
package
例えば、Cron と Anacron の両方をインストールするには、シェルプロンプトで以下を入力します。
~]# yum install cronie cronie-anacrone
このコマンドを実行するには、スーパーユーザー権限 (つまり
root
でログインしている) が必要である点に注意して下さい。Red Hat Enterprise Linux に新しいパッケージをインストールする方法の詳細については、「パッケージのインストール」 を参照して下さい。
21.1.2. Crond サービスの実行
cron ジョブと anacron ジョブの両方は、
crond
サービスが選びます。このセクションでは、crond
サービスを起動/停止/再起動する方法、それを特定のランレベルで有効にする方法について説明します。ランレベルの概念や Red Hat Enterprise Linux におけるシステムサービスの管理方法全般の詳細については、10章サービスとデーモン を参照して下さい。
21.1.2.1. Cron サービスの起動と停止
サービスが稼働中かどうかを確認するには、
/sbin/service dhcpd6 start
コマンドを使用します。
現行のセッションで
crond
サービスを実行するには、シェルプロンプトで root
として以下を入力します。
service
crond
start
ブート時にサービスが自動的に起動するよう設定するには、以下のコマンドを使用します:
chkconfig
crond
on
このコマンドで、ランレベル 2、3、4、5 でサービスが有効になります。別の方法として、「サービスの有効化と無効化」 にあるように サービスの設定 ユーティリティを使用することもできます。
21.1.2.2. Cron サービスの停止
crond
サービスを停止するには、シェルプロンプトで root
として以下を入力します。
service
crond
stop
ブート時のサービスの起動を無効にするには、以下のコマンドを使用します:
chkconfig
crond
off
このコマンドで、すべてのランレベルでサービスが無効になります。別の方法として、「サービスの有効化と無効化」 にあるように サービスの設定 ユーティリティを使用することもできます。
21.1.2.3. Cron サービスの再起動
crond
サービスを再起動するには、シェルプロンプトで以下を入力します。
service
crond
restart
このコマンドですばやくサービスを停止して、再度開始します。
21.1.3. Anacron ジョブの設定
ジョブをスケジュールするための主要設定ファイルは
/etc/anacrontab
ファイルで、root ユーザーのみがアクセスできます。このファイルには、以下のような行が記載されています。
SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly
最初の 3 行は、anacron タスクが実行される環境を設定するための変数を定義します。
SHELL
— ジョブの実行に使用されるシェル環境です (例えば、Bash シェル)。PATH
— 実行可能なプログラムへのパスです。MAILTO
— anacron ジョブの出力を Email で受け取るユーザーのユーザー名です。MAILTO
変数が定義されていない場合、(MAILTO=
)、Email は送信されません。
以下の 2 つの変数は、定義済みジョブのスケジュール時間を修正します。
RANDOM_DELAY
— ジョブごとに指定されているdelay in minutes
変数に追加される最大の時間分数。最短の遅延時間は、デフォルトで 6 分に設定されています。例えば、RANDOM_DELAY
が12
に設定されていたとすると、その特定の anacrontab における各ジョブのdelay in minutes
に 6 分から 12 分が追加されます。RANDOM_DELAY
は6
未満の設定も可能で、0
の設定もできます。0
に設定されると、ランダムな遅延は追加されません。これは例えば、1 つのネットワーク接続を共有する多くのコンピューターが毎日同じデータをダウンロードしなくてはならない場合などに有用です。START_HOURS_RANGE
— スケジュールされているジョブが実行可能になる時間単位の間隔です。停電などで時間間隔を逸してしまった場合は、その日にスケジュールされていたジョブは実行されません。
/etc/anacrontab
ファイル内の残りの行は、スケジュールされているジョブを表しており、以下の形式を取ります。
period in days delay in minutes job-identifier command
period in days
— ジョブの実行頻度の日数。属性値は整数もしくはマクロ (@daily
、@weekly
、@monthly
) として定義可能です。@daily
は整数の 1 を、@weekly
は整数の 7 を表し、and@monthly
月の長さに関係なく毎月 1 回ジョブが実行されることを指定します。delay in minutes
— ジョブの実行までに anacron が待機する分数です。属性値は整数として定義されます。値が0
に設定されると、待機は適用されません。job-identifier
— ログファイルで使用される特定のジョブを指す一意な名前です。command
— 実行するコマンドです。このコマンドは、ls /proc >> /tmp/proc
などのコマンドやカスタムスクリプトを実行するコマンドにすることができます。
先頭にハッシュ記号 (#) が付いた行はコメント行で、処理の対象外です。
21.1.3.1. Anacron ジョブの例
以下の例は、簡単な
/etc/anacrontab
ファイルを示しています:
SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=30 # the jobs will be started during the following hours only START_HOURS_RANGE=16-20 #period in days delay in minutes job-identifier command 1 20 dailyjob nice run-parts /etc/cron.daily 7 25 weeklyjob /etc/weeklyjob.bash @monthly 45 monthlyjob ls /proc >> /tmp/proc
この
anacrontab
ファイル内で定義されているジョブはすべて、ランダムに 6 分から 30 分の間で遅延することになり、16:00 時から 20:00 時の間に実行できます。
最初に定義してあるジョブは毎日、16:26 から 16:50 の間に実行されます (RANDOM_DELAY が 6 分から 30 分の間で、delay in minutes 属性がこれに 20 分追加します) 。このジョブに指定されているコマンドは、
run-parts
スクリプトを使って /etc/cron.daily
ディレクトリ内にあるすべての現行プログラムを実行します(run-parts
スクリプトがディレクトリをコマンドラインの引数として受け取り、ディレクトリ内のプログラムを順にすべて実行していきます)。
2 つ目のジョブは、
/etc
ディレクトリの weeklyjob.bash
スクリプトを週 1 回実行します。
3 つ目のジョブは、
/proc
のコンテンツを月 1 回 /tmp/proc
file (ls /proc >> /tmp/proc
) に書き込むコマンドを実行します。
21.1.4. Cron ジョブの設定
cron ジョブの設定ファイル
/etc/crontab
(root のみ修正可能) には、以下の行が記載されています。
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # 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 # | | | | | # * * * * * username command to be executed
最初の 3 行には、
anacrontab
ファイルと同様に、SHELL
と PATH
、MAILTO
の変数定義が記載されています。これらの変数に関する詳細は、「Anacron ジョブの設定」 を参照してください。
さらにこのファイルは、
HOME
変数を定義できます。HOME
変数は、ジョブが行うコマンドやスクリプトの実行時にホームディレクトリとして使用されるディレクトリを定義します。
/etc/crontab
ファイルの残りの行はスケジュールされているジョブを示しており、以下の形式を取ります。
minute hour day month day of week username command
以下は、ジョブの実行時間を定義します。
minute
— 0 から 59 までの任意の整数hour
— 0 から 23 までの任意の整数day
— 1 から 31 までの任意の整数 (月が指定されている場合は、その月の有効な日)month
— 1 から 12 までの任意の整数 (あるいは jan や feb など月の省略形)day of week
— 0 から 7 までの任意の整数。0 および 7 は日曜日を示す (あるいは sun や mon など曜日の省略形)
以下は、他のジョブプロパティを定義します。
username
— ジョブが実行されるユーザーを指定します。command
— 実行するコマンドを指定します。コマンドは、ls /proc /tmp/proc
などのコマンド、もしくはカスタムスクリプトを実行するコマンドを指定可能です。
上記のいずれかの値にアスタリスク (*) を使用すると、すべての有効な値を指定することができます。例えば、月の値をアスタリスクで定義すると、ジョブは他の値による制約の範囲内で毎月実行されます。
整数の間のハイフン (-) は、整数の範囲を指定します。例えば、
1-4
は整数 1、2、3、4 を意味します。
コンマ (,) で区切られた値の一覧は、一覧を指定します。例えば、
3, 4, 6, 8
はそれらの 4 つの整数を示します。
スラッシュ (/) を使用すると、ステップ値を指定することができます。範囲の後に
/integer
を付けると、その範囲内で、指定した整数の値をスキップすることができます。例えば、0-59/2
とすると、分フィールドで 1 分おきの間隔を定義することができます。ステップ値は、アスタリスクと併用することも可能です。例えば、月フィールドで値 */3
を指定すると、3 カ月ごとにタスクが実行されます。
先頭にハッシュ記号 (#) が付いた行はコメント行で、処理の対象外です。
root 以外のユーザーは、
crontab
ユーティリティを使用して cron タスクを設定できます。ユーザー定義の crontab は /var/spool/cron/
ディレクトリに保存されており、それを作成したユーザーが実行するかのように実行されます。
ユーザーとして crontab を作成するには、そのユーザーとしてログインし、コマンド
crontab -e
を入力してから、VISUAL
またはEDITOR
環境変数で指定されているエディターを使用してユーザーの crontab を編集します。このファイルは /etc/crontab
と同じ形式を使用します。crontab への変更を保存すると、crontab はユーザー名に応じて保存され、ファイル /var/spool/cron/username
に書き込まれます。自分の crontab ファイルのコンテンツを一覧表示するには、crontab -l
コマンドを使用します。
注記
crontab
ユーティリティでジョブを定義する際は、ユーザーを指定しないでください。
/etc/cron.d/
ディレクトリには、/etc/crontab
ファイルと同じ構文のファイルが格納されています。このディレクトリ内でファイルの作成と変更ができるのは root のみです。
注記
cron デーモンは、変更を確認するために
/etc/anacrontab
ファイル、/etc/crontab
ファイル、/etc/cron.d/
ディレクトリ、/var/spool/cron/
ディレクトリを毎分チェックします。何らかの変更が発見されると、メモリーにロードされます。そのため anacrontab または crontab のファイルが変更されても、デーモンを再起動する必要はありません。
21.1.5. Cron へのアクセスの制御
Cron へのアクセスを制御するには、
/etc/cron.allow
ファイルと/etc/cron.deny
ファイルを使用します。この両方のアクセス制御ファイルの形式は各行にユーザー名を 1 つ配置します。どちらのファイルでも空白は許可されません。
cron.allow
ファイルが存在する場合は、そのファイルに記載されているユーザーのみが cron の使用を許可され、cron.deny
ファイルは無視されます。
cron.allow
が存在しない場合は、cron.deny
に表示されているユーザーは cron を使用できません。
アクセス制御ファイルが変更された場合でも、cron デーモン (
crond
) を再起動する必要はありません。アクセス制御ファイルは、ユーザーが cron ジョブの追加または削除を試みるたびにチェックされます。
アクセス制御ファイルに記載されているユーザー名に関わらず、root ユーザーは常時 cron を使用できます。
アクセスは、PAM (Pluggable Authentication Modules) を介して制御することもできます。これらの設定値は
/etc/security/access.conf
に格納されています。例えば、このファイルに以下の行を追記すると、root ユーザー以外のユーザーは crontab の作成ができなくなります。
-:ALL EXCEPT root :cron
禁止されているジョブは、適切なログファイルにログ記録されます。また、“crontab -e” を使用している時は、標準出力に返されます。詳細は、
access.conf.5
を参照して下さい (man 5 access.conf
のコマンドで表示します)。
21.1.6. Cron ジョブのブラックリスト/ホワイトリスト
ジョブのブラックリストとホワイトリストは、ジョブの実行不要部分を定義するために使用します。
/etc/cron.daily
などの cron ディレクトリ上の run-parts スクリプトを呼び出す際にこれが有用となります。ユーザーが、ディレクトリ内にあるプログラムをジョブのブラックリストに加えると、run-parts スクリプトはこのプログラムを実行しません。
ブラックリストを定義するには、ディレクトリ内で
run-parts
スクリプトの実行元となる jobs.deny
ファイルを作成します。例えば、/etc/cron.daily
から特定のプログラムを省略する必要がある場合には、/etc/cron.daily/jobs.deny
ファイルを作成する必要があります。このファイル内で、実行を省略するプログラムの名前を指定します(同一ディレクトリ内にあるプログラムのみ可能)。run-parts /etc/cron.daily
のように、cron.daily ディレクトリからプログラムを実行するコマンドをジョブが実行する場合は、jobs.deny
ファイル内で定義されたプログラムは実行されません。
ホワイトリストを定義するには、
jobs.allow
ファイルを作成します。