6 システム・タスクの自動化
この章では、特定の期間内、特定の日時、またはシステムの負荷が軽いときにタスクを自動的に実行するようにシステムを構成する方法について説明します。
タスクの自動化について
自動化されたタスクを使用して、定期的なバックアップ、システムの監視、カスタム・スクリプトの実行などの管理タスクを実行できます。
ユーティリティのcron
とanacron
を使用すると、時刻、日にち、月、曜日および週の組合せに応じて、ジョブと呼ばれる繰返しタスクの実行をスケジュールできます。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
ジョブの場合はジョブ定義で指定されているユーザー(ある場合)として、そのジョブを実行します。
crond
はroot
として、/etc/cron.d/0hourly
のスケジュールに従って、/etc/cron.hourly
ディレクトリ内の0anacron
スクリプトを1時間に1回実行します。anacron
がまだ実行されておらず、システムがメインに接続されてバッテリ・パワーでない場合、crond
はanacron
を起動します。
anacron
はroot
として、/etc/anacrontab
にスケジュールされたジョブ定義に従って、/etc/cron.daily
、/etc/cron.weekly
および/etc/cron.monthly
ディレクトリ内のスクリプトを1日、週または月に1回実行します。
cronジョブの構成
システムcron
ジョブは、/etc/crontab
内のcrontab
形式のファイル、または/etc/cron.d
内のファイルで定義されます。通常、crontab
ファイルはジョブが実行される環境のSHELL
、PATH
、MAILTO
およびHOME
変数に対する定義で構成され、その後にジョブ自体の定義が続きます。コメント行は#
文字で始まり、ジョブ定義は次の形式を使用して指定します。
minute hour day month day-of-week user command
指定可能な各フィールドは、次のように定義されています。
- minute
-
0-59
の値を指定します。 - hour
-
0-23
の値を指定します。 - day
-
1-31
の値を指定します。 - month
-
1-12
の値を指定するか、jan
、feb
、…、dec
の値を指定します。 - day-of-week
-
0-7
(0
または7
が日曜日)の値を指定するか、sun
、mon
、…、sat
の値を指定します。 - user
-
コマンドを実行するユーザーを指定します。また、
crontab
ファイルの所有者を示すアスタリスク(*
)を指定することもできます。 - command
-
実行するシェル・スクリプトまたはコマンドを指定します。
minute
からday-of week
の各フィールドで、次の特殊文字を使用できます。
- *
-
このフィールドに有効なすべての値に対応するアスタリスク(
*
)を指定します。 -
-
-
整数範囲を示すにはダッシュ(
-
)を指定します(例:1-5
)。 - ,
-
カンマ(
,
)で区切った値のリストを指定します(例:0
、2
、4
)。 - /
-
ステップ値はスラッシュ(
/
)を使用して指定します。たとえば、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
で定義され、その中に、ジョブが実行される環境のSHELL
、PATH
、MAILTO
、RANDOM_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秒です。
バッチ・ジョブのロード平均制限および最小間隔時間を変更するには:
-
atd
構成ファイル、/etc/sysconfig/atd
を編集し、OPTS
変数を定義する行のコメントを解除し、次のように行を編集して新しいロード平均制限と最小間隔時間を指定します。OPTS="-b 100 -l 3"
この例では、最小間隔は100秒に設定され、ロード平均制限は3に設定されます。
-
atd
サービスを再起動します。sudo systemctl restart atd
-
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)
の各マニュアル・ページを参照してください。