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の内容は、ジョブを実行する環境のSHELLPATHMAILTOおよび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の値を指定するか、janfeb、…、decの値を指定します。

day-of-week

0から7の値(日曜日は0または7)、またはsunmon、...、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ファイルを作成または編集するには、次の手順を実行します。

  1. そのユーザー(例: jsmith)としてシステムにサインインします。

  2. テキスト・エディタでcrontabを編集します。

    crontab -e

    特定のテキスト・エディタを使用してcronジョブを作成または編集する必要がある場合は、次の構文を使用します。

    env EDITOR=text-editor crontab -e
  3. エディタが開いたら、cronテーブルのフィールドについてで示した形式を使用することで、cronジョブを作成します。

    15分ごとに実行するバックアップ・ジョブを定義するとします。また、ユーザー・ホーム・ディレクトリにこのタスク用のスクリプトmybackup.shを作成してあるとします。その後に、次のようにスケジュールを作成します。

    15 * * * * /home/jsmith/mybackup.sh
  4. ファイルを保存して終了します。

    このファイルは/var/spool/cron/jsmithとして保存されます。

  5. この新しい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がまだ実行されておらず、システムがメインに接続されてバッテリ・パワーでない場合、crondanacronを起動します。

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

このファイルの上部には、ジョブを実行する環境のSHELLPATHMAILTORANDOM_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使用率の監視を参照してください。

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

  1. テキスト・エディタで/etc/sysconfig/atd構成ファイルを開きます。
  2. OPTS変数を定義する行のコメントを解除します。

  3. OPTS変数にロード平均制限および最小時間間隔の新しい値を指定します。次に例を示します。

    OPTS="-b 100 -l 3"

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

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

    sudo systemctl restart atd
  5. 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の使用を参照してください。