6 システム・タスクの自動化
定期的なバックアップ、システムの監視、カスタム・スクリプトの実行などの管理タスクを自動化できます。Oracle Linuxには、ジョブ・スケジューリングのための、cron
およびanacron
という2つのユーティリティがあります。どちらのツールでもタスク(ジョブとも呼ばれる)の実行を自動化できますが、タスクの実行方法は若干異なります。どちらのユーティリティもそれぞれのデーモンによって自動的に実行されるため、これらのユーティリティを手動で実行する必要はありません。
systemd
タイマー・ユニット・ファイルも、タスクのスケジューリングに使用できます。このドキュメントで説明されているすべてのタスク自動化用ユーティリティは、組み合せて使用できます。
cronの使用
cron
により、1分ごとにジョブを実行するようにスケジュールできます。システムcron
ジョブは、/etc/crontab
という名前のcron
テーブル、または/etc/cron.d
ディレクトリ内のファイルで定義されます。ユーザー定義ジョブは、/var/spool/cron
ディレクトリに格納され、ユーザー(/var/spool/cron/jsmith
など)にちなんで名前が付けられます。crond
デーモン(これは、cron
ユーティリティを使用して、スケジュールされたジョブを実行します)により、これらの場所が参照されて、実行する必要があるジョブが判断されます。
現在の時間に実行するように構成されたジョブがこのデーモンによって識別されると、crond
デーモンにより、ジョブ定義の所有者としてそのジョブが実行されます。そのジョブがシステムcron
ジョブである場合は、このデーモンにより、ジョブ定義で指定されているユーザーとして(ユーザーが定義されている場合)ジョブが実行されます。
このデーモンでは、ジョブの実行がスケジュールされている時間にシステムが停止していた場合、システムが再起動されたときにはそのジョブは回避されて、スケジュールされている次回の時間に実行されます。
cron
ユーティリティの使用方法に関するチュートリアルは、Oracle LinuxでのCrontabユーティリティを使用したタスクのスケジュールを参照してください。
cronテーブルのフィールドについて
通常、/etc/crontab
の内容は、ジョブを実行する環境のSHELL
、PATH
、MAILTO
およびHOME
変数の定義からなります。これらの定義の後に、ジョブ定義自体が続きます。コメント行は#
の文字で始まります。
ジョブが構成されていない/etc/crontab
ファイルは、次のとおりです:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
# | | | | |
# * * * * * user-name command to be executed
ジョブ定義は、次のような、適切なフィールドに指定した情報からなります。
- 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
ノート:
実行可能なジョブ・スクリプトを/etc/cron.hourly
ディレクトリに追加すると、そのスクリプトはcrond
によって1時間ごとに実行されます。
/etc/crontab
ファイル内のすべてのジョブは、rootとして実行されます。
詳細は、crontab(5)
マニュアル・ページを参照してください。
cronジョブの作成
すべてのユーザーがcron
ジョブを作成できますが、ジョブ定義の場所はユーザーの権限によって異なります。
-
root
としてサインインした管理者は、/etc/crontab
に格納されるジョブを作成します。ジョブ定義で別のユーザーが指定されていないかぎり、/etc/crontab
内のジョブはrootとして実行されます。 -
管理者権限があるユーザーは、
cron
ジョブを作成できます。それらのジョブは/etc/crontab.d/
に格納され、管理者のユーザー名にちなんで命名されます。 -
通常のユーザーは、
/etc/crontab.d/
に格納されるジョブを作成できます。そのジョブ・ファイルは、ユーザーの名前に基づきます。
ユーザー(jsmith
など)としてcrontab
ファイルを作成または編集するには、次の手順を実行します。
-
そのユーザー(例:
jsmith
)としてシステムにサインインします。 -
テキスト・エディタで
crontab
を編集します。crontab -e
特定のテキスト・エディタを使用して
cron
ジョブを作成または編集する必要がある場合は、次の構文を使用します。env EDITOR=text-editor crontab -e
-
エディタが開いたら、cronテーブルのフィールドについてで示した形式を使用することで、cronジョブを作成します。
15分ごとに実行するバックアップ・ジョブを定義するとします。また、ユーザー・ホーム・ディレクトリにこのタスク用のスクリプトmybackup.shを作成してあるとします。その後に、次のようにスケジュールを作成します。
15 * * * * /home/jsmith/mybackup.sh
-
ファイルを保存して終了します。
このファイルは
/var/spool/cron/jsmith
として保存されます。 -
この新しいcronジョブの内容を表示して確認します。
crontab -l
15 * * * * /home/jsmith/mybackup.sh
ユーザーのcrontab
ファイルを削除するには、次のように入力します。
crontab -r
詳細は、crontab(5)
マニュアル・ページを参照してください。
cronジョブの実行に対するアクセスの制御
次のファイル(それぞれにユーザー名が含まれている)により、cronジョブを実行するためのアクセス制御を管理します。
/etc/cron.allow
には、cron
ジョブの実行が許可されているユーザーのリストが含まれています。/etc/cron.deny
には、cron
ジョブの実行を許可されていないユーザーのリストが含まれています。
両方のファイルが存在する場合は、/etc/cron.allow
が優先されます。このリスト内のユーザーがcron
ジョブの実行を許可され、/etc/cron.deny
は無視されます。/etc/cron.deny
のみが存在する場合は、このリストにないユーザーのみがcron
ジョブを実行できます。
これら2つのファイルがどちらも存在しない場合は、root
のみがcron
ジョブを実行できます。
anacronジョブの構成
anacron
ユーティリティは、次の点で、cron
ユーティリティとは異なります。anacron
では、スケジュールされたジョブを実行できる回数が制限されて、日次のみになります。anacron
ユーティリティは、主にラップトップ・コンピュータで使用することを目的としています。
anacron
がまだ実行されておらず、システムがメインに接続されてバッテリ・パワーでない場合、crond
はanacron
を起動します。
crond
デーモンにより、次のジョブ定義がある/etc/cron.d/0hourly
内のスケジュールに従って、1時間ごとにroot
として/etc/cron.hourly/0anacron
スクリプトが実行されます:
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
その後、/etc/anacrontab
内の構成設定に基づいて、0anacron
スクリプトが/etc/cron.daily
、/etc/cron.weekly
および/etc/cron.monthly
ディレクトリの内容が処理されます。
スケジュールされたジョブがシステム停止時間のために実行されていない場合、そのジョブはシステムの再起動時に実行されます。
システム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=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
このファイルの上部には、ジョブを実行する環境のSHELL
、PATH
、MAILTO
、RANDOM_DELAY
およびSTART_HOURS_RANGE
変数の定義が含まれており、その後にジョブ定義自体が続きます。コメント行は#
の文字で始まります。
RANDOM_DELAY
は、anacron
によってジョブに対するdelayパラメータに追加されるランダム時間の最大分数です。デフォルトの最小遅延は6分です。ランダム・オフセットは、多数のジョブの同時実行が原因のanacron
によるシステムのオーバーロードを回避することが目的です。
START_HOURS_RANGE
は、スケジュールされたジョブをanacronで実行できる1日の中の時間範囲です。
このファイルの下部にはジョブ定義が含まれています。各ジョブは、次の見出しが付いた4つの列に分かれたエントリからなります。
- period
-
日数または
@daily
、@weekly
または@monthly
(日次、週次または月次)で指定されるジョブ実行の頻度。 - delay
-
ジョブの実行前に待機する分数。
- job-id
-
ログ・ファイルにおけるジョブの一意名。
- command
-
実行するシェル・スクリプトまたはコマンド。
デフォルトでは、anacron
によって03:00から22:00の間にジョブが実行され、11分から50分の間でジョブがランダムに遅延されます。/etc/cron.daily
内のジョブ・スクリプトは、システムが稼働中の場合は毎日03:11から03:50までの間に実行され、そうでない場合は、システムのブート後に、22:00より前に実行されます。run-parts
スクリプトでは、その引数で指定されたディレクトリ内の各プログラムが連続して実行されます。
/etc/cron.weekly
内のスクリプトは、毎週31分から70分までの遅延オフセットで実行されます。
/etc/cron.monthly
内のスクリプトは、毎月51分から90分までの遅延オフセットで実行されます。
詳細は、anacron(8)
およびanacrontab(5)
の各マニュアル・ページを参照してください。
1回かぎりのタスクの実行
atd
サービスにより、特定のコマンドを使用して1回かぎりのタスクをスケジュールできます。
この項では、この目的のためのat
コマンドおよびbatch
コマンドの使用について説明します。これらのコマンドを使用する前に、at
サービスが実行されていることを確認します。
sudo systemctl is-active atd
-
指定した時間に1回のみ実行するようにタスクをスケジュールするには、
at
コマンドを使用します。~/atjob
内でジョブを定義してあるとします。そのジョブを20分間隔でスケジュールするには、次のように入力します。at now + 20 minutes < ~/atjob
job 1 at 2021-03-19 11:25
-
システム・ロード平均が低いときにバッチ・ジョブを実行するようにスケジュールするには、
batch
コマンドを使用します。~/batchjob
内でバッチ・ジョブを定義してあるとします。システム・ロード平均が0.8未満の場合にこのジョブを実行するようにスケジュールするには、次のように入力します。sudo batch < batchjob
job 2 at 2013-03-19 11:31
ノート:
システム・ロード平均のしきい値(このしきい値を下回ったときにユーザー定義のバッチ・ジョブが実行される)は、デフォルトでは0.8です。ただし、その値は変更できます。バッチ・ジョブの動作の変更を参照してください。
-
キューに入っているスケジュール済の1回かぎりのジョブをすべてリストするには、次のように入力します。
sudo atq
job 1 at 2021-03-19 11:25 job 2 at 2013-03-19 11:31
-
キューに入れられた1つ以上のジョブを取り消すには、次の例のように、atrmコマンドにそのジョブ番号を指定します。
sudo atrm 2
詳細は、at(1)
マニュアル・ページを参照してください。
バッチ・ジョブの動作の変更
システム・ロード平均とは、一定期間にCPUまたはCPUコアでの実行のためにキューに入れられるプロセスの平均数のことです。通常、システムでは、ロード平均がCPUまたはCPUコアの数の0.8倍を超えるまでは、過負荷とみなされません。このようなシステムでは通常、ロード平均が、デフォルト制限の0.8ではなくCPUまたはCPUコア数未満になったときに、atd
でバッチ・ジョブが実行されるようにします。たとえば、4つのCPUコアがあるシステムでは、ロード平均制限を3.2に設定でき、これを超えるとatd
でバッチ・ジョブを実行できません。
バッチ・ジョブの通常の実行時間が1分を超えることがわかっている場合は、バッチ・ジョブの開始間でatd
が待機する最小間隔を変更することもできます。デフォルトの最小間隔は60秒です。
CPU使用率の監視、およびシステム・ロード平均の表示の詳細は、CPU使用率の監視を参照してください。
バッチ・ジョブのロード平均制限および最小間隔時間を変更するには:
- テキスト・エディタで
/etc/sysconfig/atd
構成ファイルを開きます。 -
OPTS
変数を定義する行のコメントを解除します。 -
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)
の各マニュアル・ページを参照してください。
systemdタイマーの使用
タイマー・ユニット・ファイルは、systemctl
ユーティリティでタスクのスケジューリングに使用されるsystemd
ファイルの一種です。このユーティリティはcron
ユーティリティに似ており、cronユーティリティでは、同じ目的のためにcrontab
およびその他のcron
ジョブが使用されます。
一般に、パッケージでシステムで機能する特定のサービスが使用される場合、そのパッケージには、それ固有のsystemd
タイマー・ユニット・ファイルが含まれています。そのため、このようなパッケージがOracle Linuxとともにインストールされるときには、そのタイマー・ユニット・ファイルが自動的に含まれます。次のコマンドを使用すると、システム内のタイマー・ファイルを表示できます。
systemctl list-unit-files --type=timer
ノート:
タイマー・ファイルのリストは、Oracle Linuxが実行されている場所(Oracle Cloud Infrastructureにあるインスタンス、物理システムなど)によって異なる場合があります。
各タイマー・ユニット・ファイルには、タスクのスケジュールを管理するパラメータ設定が含まれています。たとえば、dnf-makecache.service
を実行するスケジュールは、dnf-makecache.timer
ファイル内で設定されます。このファイルには、次のような設定が含まれています。
systemctl cat dnf-makecache.timer
# /usr/lib/systemd/system/dnf-makecache.timer
[Unit]
Description=dnf makecache --timer
ConditionKernelCommandLine=!rd.live.image
# See comment in dnf-makecache.service
ConditionPathExists=!/run/ostree-booted
Wants=network-online.target
[Timer]
OnBootSec=10min
OnUnitInactiveSec=1h
RandomizedDelaySec=60m
Unit=dnf-makecache.service
[Install]
WantedBy=timers.target
スケジュール情報は、[Timer]
セクションで指定します。この構成例では、dnf-makecache.service
サービスが、システムがブートされた10分後に自動実行されるように設定されています。このサービスは、その後、OnUnitInactiveSec
パラメータで指定されているとおり、1時間の間、アイドル・モードになります。この時間が終了すると、このサービスが再度実行されます。このサイクルは無期限に続き、1時間ごとに起こります。
RandomizedDelaySec
設定では、実行をそのスケジュールよりどのくらい遅らせることができるかの上限値を指定します。この例では、このサービスの実行は、遅くともそのスケジュールの1分後まで許可されています。このパラメータは、指定したスケジュールで同時に開始されるジョブが多くなりすぎないようにするために役立ちます。そのようにしないと、リソースが過負荷になる可能性があります。
OnCalendar
も、タスク・スケジューリングのための有用なパラメータです。このパラメータが次のように設定されているとします。
OnCalendar=*:00/10
*:00
により毎正時を表し、/10
という設定により10分を表しています。したがって、このジョブは、毎正時の10分後に、1時間ごとに実行されるように設定されます。
ジョブのスケジューリングのためのsystemd
タイマー・ユニット・ファイルのパラメータをすべて示すリストは、systemd.timer(5)
のマニュアル・ページを参照してください。
systemd
タイマー・ユニット・ファイルの構成方法など、Oracle Linuxでのsystemd
の使用方法に関するチュートリアルは、Oracle Linuxでのsystemdの使用を参照してください。