Red Hat Training

A Red Hat training course is available for Red Hat Linux

第21章 システムタスクの自動化

ジョブ としても知られるタスクは、指定した期日に指定した期間だけ、またはシステムのロード平均が 0.8 を下回る時に、自動的に実行するように設定できます。
Red Hat Enterprise Linux は、システムを最新状態に保つために重要なシステムタスクを実行するように事前設定されています。例えば、locate コマンドで使用される slocate データベースは毎日更新されます。システム管理者は、この自動化タスクを使用して定期的なバックアップ、システムの監視、カスタムスクリプトの実行などの作業を実施することができます。
Red Hat Enterprise Linux は、cronanacronatbatch といった自動化タスクユーティリティを備えています。
ユーティリティはすべて、異なるジョブタイプのスケジュール管理を目的としています。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-anacroncronie のサブパッケージ) をインストールする必要があります。
システムにパッケージがインストール済みかどうかを確認するには、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_DELAY12 に設定されていたとすると、その特定の anacrontab における各ジョブの delay in minutes に 6 分から 12 分が追加されます。RANDOM_DELAY6 未満の設定も可能で、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 ファイルと同様に、SHELLPATHMAILTO の変数定義が記載されています。これらの変数に関する詳細は、「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 ファイルを作成します。
jobs.denyjobs.allow の原則は、「Cron へのアクセスの制御」 セクションに説明した cron.denycron.allow の原則と同じです。