6 システム・タスクの自動化

この章では、特定の期間内、特定の日時、またはシステムの負荷が軽いときにタスクを自動的に実行するようにシステムを構成する方法について説明します。

タスクの自動化について

自動化されたタスクを使用して、定期的なバックアップ、システムの監視、カスタム・スクリプトの実行などの管理タスクを実行できます。

ユーティリティのcronanacronを使用すると、時刻、日にち、月、曜日および週の組合せに応じて、ジョブと呼ばれる繰返しタスクの実行をスケジュールできます。cronコマンドでは、1分ごとにジョブを実行するようにスケジュールできます。ジョブがスケジュールされているときにシステムが停止した場合、システムの再起動時にcronはジョブを実行しません。

anacronコマンドは、システム・ジョブが1日に1回のみ実行されるようにスケジュールします。ただし、スケジュールされたジョブが実行されていない場合、そのジョブはシステムの再起動時に実行されます。anacronコマンドは、主にラップトップ・コンピュータで使用することを目的としています。

通常、cronおよびanacronを直接実行する必要はありません。crondデーモンがcronのかわりにスケジュール済タスクを実行し、anacronを1時間に1回起動します。crondは、/etc/crontabまたは/etc/cron.d内のファイルでシステムのcronジョブ定義を確認し、/var/spool/cronでユーザーに属するcronジョブ定義を確認します。crondは各ジョブ定義をチェックして、現行の分内に実行する必要があるかどうかを確認します。ジョブの実行がスケジュールされている場合、crondは、ジョブ定義ファイルの所有者として、またはシステムのcronジョブの場合はジョブ定義で指定されているユーザー(ある場合)として、そのジョブを実行します。

crondrootとして、/etc/cron.d/0hourlyのスケジュールに従って、/etc/cron.hourlyディレクトリ内の0anacronスクリプトを1時間に1回実行します。anacronがまだ実行されておらず、システムがメインに接続されてバッテリ・パワーでない場合、crondanacronを起動します。

anacronrootとして、/etc/anacrontabにスケジュールされたジョブ定義に従って、/etc/cron.daily/etc/cron.weeklyおよび/etc/cron.monthlyディレクトリ内のスクリプトを1日、週または月に1回実行します。

cronジョブの構成

システムcronジョブは、/etc/crontab内のcrontab形式のファイル、または/etc/cron.d内のファイルで定義されます。通常、crontabファイルはジョブが実行される環境のSHELLPATHMAILTOおよびHOME変数に対する定義で構成され、その後にジョブ自体の定義が続きます。コメント行は#文字で始まり、ジョブ定義は次の形式を使用して指定します。

                  minute  hour  day  month  day-of-week  user  command
               

指定可能な各フィールドは、次のように定義されています。

minute

0-59の値を指定します。

hour

0-23の値を指定します。

day

1-31の値を指定します。

month

1-12の値を指定するか、janfeb、…、decの値を指定します。

day-of-week

0-7 (0または7が日曜日)の値を指定するか、sunmon、…、satの値を指定します。

user

コマンドを実行するユーザーを指定します。また、crontabファイルの所有者を示すアスタリスク(*)を指定することもできます。

command

実行するシェル・スクリプトまたはコマンドを指定します。

minuteからday-of weekの各フィールドで、次の特殊文字を使用できます。

*

このフィールドに有効なすべての値に対応するアスタリスク(*)を指定します。

-

整数範囲を示すにはダッシュ(-)を指定します(例: 1-5)。

,

カンマ(,)で区切った値のリストを指定します(例: 024)。

/

ステップ値はスラッシュ(/)を使用して指定します。たとえば、hourフィールドの/3などです。このエントリは、3時間ごととして解釈されます。

たとえば、次のエントリでは、平日に5分ごとにコマンドが実行されます。

0-59/5  *  *  *  1-5  *  command
               

4月、6月、9月および11月の1日の午前0時1分にコマンドを実行します。

1  0  1  4,6,9,11  *  *  command
               

rootユーザーは、ジョブ定義のエントリを/etc/crontabに追加することも、crontab形式のファイルを/etc/cron.dディレクトリに追加することもできます。

ノート:

実行可能なジョブ・スクリプトを/etc/cron.hourlyディレクトリに追加すると、そのスクリプトはcrondによって1時間ごとに実行されます。スクリプトでまだ実行されていないことを確認する必要があります。

詳細は、crontab(5)マニュアル・ページを参照してください。

 cronジョブの実行に対するアクセスの制御

許可されている場合は、root以外のユーザーがcrontabコマンドを使用してcronタスクを構成できます。ユーザー定義のcrontab形式のファイルはすべて、作成したユーザーと同じ名前で/var/spool/cronディレクトリに格納されます。

rootは、/etc/cron.allowおよび/etc/cron.denyファイルを使用して、cronに対するアクセスを制限できます。crontabでは、ユーザーがcronジョブを追加または削除しようとするたびに、アクセス制御ファイルがチェックされます。/etc/cron.allowが存在する場合は、これにリストされているユーザーのみがcronの使用を許可され、/etc/cron.denyは無視されます。/etc/cron.allowが存在しない場合、/etc/cron.denyにリストされているユーザーはcronの使用を許可されません。いずれのファイルも存在しない場合は、rootのみがcronを使用できます。/etc/cron.allowおよび/etc/cron.deny両方の形式は、各行に1ユーザー名です。

crontabファイルをあるユーザーとして作成または編集するには、そのユーザーでログインし、コマンドcrontab -eを入力すると、crontabファイルがviエディタ(あるいはEDITORまたはVISUAL環境変数で指定したエディタ)で開きます。ファイルの形式は、ユーザー・フィールドが省略されている以外は/etc/crontabと同じです。ファイルに対する変更内容を保存すると、これらはファイル/var/spool/cron/usernameに書き込まれます。crontabファイルの内容をリストするには、crontab -lコマンドを使用します。crontabファイルを削除するには、crontab -rコマンドを使用します。

詳細は、crontab(1)マニュアル・ページを参照してください。

anacronジョブの構成

システムanacronジョブは/etc/anacrontabで定義され、その中に、ジョブが実行される環境のSHELLPATHMAILTORANDOM_DELAYおよびSTART_HOURS_RANGE変数に対する定義が含まれ、その後にジョブ定義自体が続きます。コメント行は#の文字で始まります。

RANDOM_DELAYは、anacronによってジョブに対するdelayパラメータに追加されるランダム時間の最大分数です。デフォルトの最小遅延は6分です。ランダム・オフセットは、多数のジョブの同時実行が原因のanacronによるシステムのオーバーロードを回避することが目的です。

START_HOURS_RANGEは、スケジュールされたジョブをanacronで実行できる1日の中の時間範囲です。

ジョブ定義は次の形式で指定します。

                  period  delay  job-id  command
               

指定可能なフィールドの説明は、次のとおりです。

period

日数、あるいは日、週または月ごとに1回の場合は@daily@weeklyまたは@monthlyで指定されるジョブ実行の頻度。

delay

ジョブの実行前に待機する分数。

job-id

ログ・ファイルにおけるジョブの一意名。

command

実行するシェル・スクリプトまたはコマンド。

次のエントリは、デフォルトの/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=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

デフォルトでは、anacronによって03:00から22:00の間にジョブが実行され、11分から50分の間でジョブがランダムに遅延されます。/etc/cron.dailyのジョブ・スクリプトは、システムが実行中の場合は、毎日03:11から03:50の間の任意の時間に、またはシステムのブート後で時間が22:00になる前の任意の時間に実行されます。run-partsスクリプトでは、その引数で指定されたディレクトリ内の各プログラムが順番に実行されます。

/etc/cron.weeklyのスクリプトは、週に1回、31分から70分の間の遅延オフセットで実行されます。

/etc/cron.monthlyのスクリプトは、週に1回、51分から90分の間の遅延オフセットで実行されます。

詳細は、anacron(8)およびanacrontab(5)の各マニュアル・ページを参照してください。

1回かぎりのタスクの実行

atコマンドを使用して、1回かぎりのタスクを指定した時間に実行するようにスケジュールするか、またはbatchコマンドを使用して、1回かぎりのタスクをシステム・ロード平均が0.8を下回ったときに実行するようにスケジュールできます。atまたはbatchを使用するには、atdサービスが実行中である必要があります。

sudo systemctl is-active atd
active

atでは、時間はその引数で取得され、実行対象のコマンドは標準入力から読み取られます。たとえば、ファイルatjobのコマンドを20分後に実行します。

sudo at now + 20 minutes < ./atjob
job 1 at 2013-03-19 11:25

atqコマンドでは、実行するためにキューに入れられたatジョブが示されます。

sudo atq
1	2013-03-19 11:25 a root

batchコマンドでもコマンドは標準入力から読み取られますが、システム・ロード平均が0.8を下回るまで実行されません。たとえば:

sudo batch < batchjob
job 2 at 2013-03-19 11:31

キューに入れられた1つ以上のジョブを取り消すには、次の例のように、atrmコマンドにそのジョブ番号を指定します。

sudo atrm 1 2

詳細は、at(1)マニュアル・ページを参照してください。

バッチ・ジョブの動作の変更

uptimeおよびwコマンドによって表示されるシステムのロード平均は、一定期間にCPUまたはCPUコア上で実行するためにキューに入れられるプロセスの平均数を表します。通常、システムでは、CPUまたはCPUコア数の0.8倍を超えるまではオーバーロードであるとみなされません。このようなシステムでは通常、ロード平均が、デフォルト制限の0.8ではなくCPUまたはCPUコア数を下回ったときに、atdでバッチ・ジョブが実行されるようにします。たとえば、4つのCPUコアがあるシステムでは、ロード平均制限を3.2に設定でき、これを超えるとatdでバッチ・ジョブは実行されません。

バッチ・ジョブの通常の実行時間が1分を超えることがわかっている場合は、バッチ・ジョブの開始間でatdが待機する最小間隔を変更することもできます。デフォルトの最小間隔は60秒です。

バッチ・ジョブのロード平均制限および最小間隔時間を変更するには:

  1. atd構成ファイル、/etc/sysconfig/atdを編集し、OPTS変数を定義する行のコメントを解除し、次のように行を編集して新しいロード平均制限と最小間隔時間を指定します。

    OPTS="-b 100 -l 3"

    この例では、最小間隔は100秒に設定され、ロード平均制限は3に設定されます。

  2. atdサービスを再起動します。

    sudo systemctl restart atd
  3. atdデーモンが新しい最小間隔およびロード平均制限で実行中であることを確認します。

    sudo systemctl status atd
    atd.service - Job spooling tools
       Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled)
       Active: active (running) since Mon 2014-04-28 15:37:04 BST; 2min 53s ago
     Main PID: 6731 (atd)
       CGroup: /system.slice/atd.service
               └─6731 /usr/sbin/atd -f -b 100 -l 3
    
    Apr 28 15:37:04 localhost.localdomain systemd[1]: Started Job spooling tools.

詳細は、systemctl(1)およびatd(8)の各マニュアル・ページを参照してください。