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

Red Hat Enterprise Linux は、タスク (ジョブ とも呼ばれます) を自動的に実行するように設定できます。

本章では、これらのタスクの実行方法を説明します。

24.1. cron を使用した繰り返しジョブのスケジュール設定

Cron は、タスク (別名ジョブ) を定期的に実行するためにスケジュールを設定するサービスです。cron のジョブは、設定した時間にシステムが稼働している場合のみ実行されます。システムの起動時まで実行を延期して、システムが稼動していない場合にジョブが「消失」しないようにするスケジューの設定の方法は 「at を使用した特定の時間にジョブを実行するスケジュールの設定」 を参照してください。

ユーザーは、cron テーブルファイル (crontab ファイルとも呼ばれます) で cron ジョブを指定します。その後、これらのファイルは crond サービスが読み取り、ジョブを実行します。

24.1.1. cron ジョブの前提条件

cron ジョブのスケジュール設定を行う前に、以下を行います。

  1. cronie パッケージをインストールします。

    ~]# yum install cronie
  2. crond サービスはインストール時に有効になっており、ブート時に自動的に開始するように設定されています。サービスを無効にしている場合は有効にしてください。

    ~]# systemctl enable crond.service
  3. 現在のセッションで crond サービスを開始します。

    ~]# systemctl start crond.service
  4. (オプション) cron を設定します。たとえば、以下を変更できます。

    • ジョブの実行時に使用するシェル
    • PATH 環境変数
    • ジョブが E メールを送信する場合はメールアドレス

      cron の設定に関する詳細は、crontab(5) man ページを参照してください。

24.1.2. cron ジョブのスケジュール設定

root ユーザーとしてジョブをスケジュール設定する

rootユーザーは /etc/crontab にある cron テーブルを使用しますが、/etc/cron.d/ に cron テーブルファイルを作成することを推奨します。root としてジョブをスケジュール設定するときは、この方法を使用します。

  1. 以下を選択します。

    • ジョブを実行する時刻 (分)。たとえば、10分間隔で指定する場合は 0,10,20,30,40,50 または 0/10 を使用します。
    • ジョブを実行する時刻 (時)。たとえば、17:00 から 20:59 までと指定する場合は 17-20 を使用します。
    • ジョブを実行する日。たとえば、15 日と指定する場合は 15 を使用します。
    • ジョブを実行する月。たとえば、Jun,Jul,Aug または 6,7,8 を使用して月の月を指定します。
    • ジョブを実行する曜日。たとえば、曜日と無関係にジョブを実行する場合は * を使用します。

      選択した値を時間指定と組み合せます。上記の例をこの時間指定に適用すると、以下のようになります。

      0,10,20,30,40,50 17-20 15 Jun,Jul,Aug *

  2. ユーザーを指定します。ジョブは、このユーザーが実行したように実行されます。たとえば、root 公開鍵の値を上書きするには、
  3. 実行するコマンドを指定します。たとえば、/usr/local/bin/my-script.sh を使用します。
  4. 上記の指定を 1 行にまとめると、以下のようになります。

    0,10,20,30,40,50 17-20 15 Jun,Jul,Aug * root /usr/local/bin/my-script.sh
  5. 完成した行を /etc/crontab に追加するか、代わりに /etc/cron.d/ に cron テーブルファイルを作成し、この行を追加します。後者が推奨されます。

これでジョブはスケジュールされたとおりに実行されます。

ジョブの指定方法に関する詳細は、crontab(5) man ページを参照してください。基本的な情報は、/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
root 以外のユーザーとしてジョブをスケジュール設定する

非 root ユーザーは、crontab ユーティリティーを使用して cron ジョブを設定します。このジョブは、このユーザーが実行したように実行されます。

cron ジョブを特定のユーザーとして作成するには、以下を使用します。

  1. ユーザーのシェルから以下を実行します。

    [bob@localhost ~]$ crontab -e

    これにより、VISUAL または EDITOR 環境変数により指定したエディターを使用して、ユーザーが自分で crontab ファイルを編集できます。

  2. ???TITLE??? にある方法と同じ方法でジョブを指定します。たとえば、以下を追加する代わりに、

    0,10,20,30,40,50 17-20 15 Jun,Jul,Aug * bob /home/bob/bin/script.sh

    以下を追加します。

    0,10,20,30,40,50 17-20 15 Jun,Jul,Aug * /home/bob/bin/script.sh
  3. ファイルを保存して、エディターを終了します。
  4. (オプション) 新しいジョブを確認するときは、以下を実行し、現在のユーザーの crontab ファイルの内容を表示します。

    [bob@localhost ~]$ crontab -l
    @daily /home/bob/bin/script.sh
ジョブの時間、日、週、月ごとのスケジュール設定

ジョブを時間、日、週、または月ごとにスケジュールするには、以下を実行します。

  1. ジョブに実行させたいアクションをシェルスクリプトに入力します。
  2. シェルスクリプトを以下のディレクトリーのうちの 1 つに入力します。

    • /etc/cron.hourly/
    • /etc/cron.daily/
    • /etc/cron.weekly/
    • /etc/cron.monthly/

以後、ユーザーのスクリプトが実行されます。crond サービスが /etc/cron.hourly/etc/cron.daily/etc/cron.weekly/etc/cron.monthly ディレクトリーにあるスクリプトを、対応する時間に自動的に実行します。

24.2. Anacron を使用した繰り返しの非同期ジョブのスケジュール設定

cron と同様、Anacron は、タスク (別名ジョブ) を定期的に実行するためにスケジュールを設定するサービスです。ただし、以下の 2 つの方法で、anacroncron とは異なります。

  • 予定した時間にシステムが稼働していなかった場合、anacron のジョブはシステムが稼働するまで延期されます。
  • anacron のジョブは、最大で 1 日 1 回実行することができます。

ユーザーは、anacrontab ファイルとも呼ばれる anacron テーブルファイルで anacron ジョブを指定します。その後、これらのファイルは crond サービスが読み取り、ジョブを実行します。

24.2.1. Anacrob ジョブの前提条件

anacron ジョブのスケジュール設定を行う前に、以下を行います。

  1. cronie-anacron パッケージがすでにインストールされていることを確認します。

    ~]# rpm -q cronie-anacron

    cronie-anacron はすでにインストールされる可能性があります。これは、cronie パッケージのサブパッケージであるためです。インストールされていない場合は、以下のコマンドを使用します。

    ~]# yum install cronie-anacron
  2. crond サービスはインストール時に有効になっており、ブート時に自動的に開始するように設定されています。サービスを無効にしている場合は有効にしてください。

    ~]# systemctl enable crond.service
  3. 現在のセッションで crond サービスを開始します。

    ~]# systemctl start crond.service
  4. (オプション) anacron を設定します。たとえば、以下を変更できます。

    • ジョブの実行時に使用するシェル
    • PATH 環境変数
    • ジョブが E メールを送信する場合はメールアドレス

      anacron の設定は、anacrontab(5) man ページを参照してください。

重要

デフォルトでは、anacron 設定には、コンピューターが接続していない場合は実行できないようにする条件が含まれています。この設定により、anacron ジョブの実行によりバッテリーが消耗することはありません。

コンピューターがバッテリーで動作している場合でも anacron の実行を許可する場合は、/etc/cron.hourly/0anacron ファイルを開いて、次の部分をコメントアウトします。

# Do not run jobs when on battery power
online=1
for psupply in AC ADP0 ; do
  sysfile="/sys/class/power_supply/$psupply/online"

  if [ -f $sysfile ] ; then
    if [ `cat $sysfile 2>/dev/null`x = 1x ]; then
      online=1
      break
    else
      online=0
    fi
  fi
done

24.2.2. Anacron ジョブのスケジュール設定

root ユーザーとして anacron ジョブのスケジュール設定

root ユーザーは、/etc/anacrontab の anacron テーブルを使用します。root としてジョブをスケジュール設定するときは、以下の手順を使用します。

root ユーザーとして anacron ジョブのスケジュール設定

  1. 以下を選択します。

    • ジョブを実行する頻度。たとえば、毎日を指定する場合は 1、3 日に 1 回を指定する場合は 3 を使用します。
    • ジョブ実行の遅延。たとえば、遅延なしを指定する場合は 0、1 時間の遅延を指定する場合は 60 を使用します。
    • ロギングに使用されるジョブ識別子。たとえば、my.anacron.job を使用してジョブを my.anacron.job 文字列でログに記録します。
    • 実行するコマンド。たとえば、/usr/local/bin/my-script.sh を使用します。

      選択した値をジョブ指定に組み合せます。以下は指定の例です。

      3 60 cron.daily /usr/local/bin/my-script.sh
  2. 作成された行を /etc/anacrontab に追加します。

これでジョブはスケジュールされたとおりに実行されます。

簡単なジョブの例は、/etc/anacrontab ファイルを参照してください。ジョブの指定方法に関する詳細は、anacrontab(5) man ページを参照してください。

ジョブの時間、日、週、月ごとのスケジュール設定

ジョブは、anacron を使用して日、週、月ごとにスケジュールを設定できます。「ジョブの時間、日、週、月ごとのスケジュール設定」を参照してください。

24.3. at を使用した特定の時間にジョブを実行するスケジュールの設定

1 回限りのタスク (別名ジョブ) を指定した時間に 1 回実行するようスケジュール設定するときは、at ユーティリティーを使用します。

ユーザーは、at ユーティリティーを使用して at ジョブを指定します。このジョブはその後 atd サービスにより実行されます。

24.3.1. at ジョブの前提条件

at ジョブのスケジュール設定を行う前に、以下を行います。

  1. at パッケージをインストールします。

    ~]# yum install at
  2. atd サービスはインストール時に有効になっており、ブート時に自動的に開始するように設定されています。サービスを無効にしている場合は有効にしてください。

    ~]# systemctl enable atd.service
  3. 現在のセッションで atd サービスを開始します。

    ~]# systemctl start atd.service

24.3.2. at ジョブのスケジュール設定

  1. ジョブは常に複数のユーザーにより実行されます。希望するユーザーとしてログインし、以下を実行します。

    ~]# at time

    time を時間指定に置き換えます。

    時間の指定に関する詳細は、at(1) の man ページと /usr/share/doc/at/timespec ファイルを参照してください。

    例24.1 at の時間指定

    ジョブを 15:00 に実行するには、以下を実行します。

    ~]# at 15:00

    指定した時間を過ぎると、そのジョブは翌日の同じ時間に実行されます。

    ジョブを 2017 年 8 月 20 日に実行するには、以下を実行します。

    ~]# at August 20 2017

    または

    ~]# at 082017

    ジョブを 5 日後に実行するには、以下を実行します。

    ~]# now + 5 days
  2. at> プロンプトが表示されたら、以下のコマンドを入力して実行し、Enter を押します。

    ~]# at 15:00
    at> sh /usr/local/bin/my-script.sh
    at>

    実行したいすべてのコマンドにこの手順を繰り返します。

    注記

    at> プロンプトに、使用されるシェルが表示されます。

    warning: commands will be executed using /bin/sh

    at ユーティリティーは、ユーザーの SHELL 環境変数にあるシェルのセット、ユーザーのログインシェル、または /bin/sh の、いずれか最初に発見されたものを使用します。

  3. 空の行で Ctrl+D キーを押し、ジョブの指定を完了します。
注記

コマンドセットやスクリプトが標準出力に情報を表示しようとする場合、その出力はユーザーにメールで送信されます。

保留中のジョブの表示

保留中のジョブ一覧を表示するには、atq コマンドを使用します。

~]# atq
26   Thu Feb 23 15:00:00 2017 a root
28   Thu Feb 24 17:30:00 2017 a root

各ジョブは、個別の行に以下のフォーマットで表示されます。

job_number scheduled_date scheduled_hour job_class user_name

job_queue 列はジョブが at または batch ジョブであるかどうかを指定します。aat を表します。bbatch を表します。

非 root ユーザーが閲覧できるのは、自分のジョブのみです。root ユーザーは、すべてのユーザーのジョブを閲覧できます。

スケジュール設定したジョブの削除

スケジュール設定したジョブを削除するには、以下を行います。

  1. atq コマンドを使用して、保留中のジョブを一覧表示します。

    ~]# atq
    26   Thu Feb 23 15:00:00 2017 a root
    28   Thu Feb 24 17:30:00 2017 a root
  2. スケジュールを設定した時間とユーザーを使用しえ、削除するジョブを検索します。
  3. ジョブを番号で指定し、atrm コマンドを実行します。

    ~]# atrm 26

24.3.2.1. at と batch へのアクセスの制御

特定ユーザーによる atbatch コマンドへのアクセスを制限できます。そのためには、以下のルールに従ってユーザー名を /etc/at.allow または /etc/at.deny に組み込みます。

  • 両方のアクセス制御ファイルは、同じフォーマットを使用します。ユーザー名は、各行に 1 人ずつです。
  • いずれのファイルでも、空白は許可されません。
  • at.allow ファイルが存在する場合は、ファイルに一覧表示されているユーザーのみが at または batch を使用でき、at.deny ファイルは無視されます。
  • at.allow が存在しない場合、at.deny に一覧表示されているユーザーは、at または batch を使用することができませ ん。
  • root ユーザーはアクセス制御ファイルの影響を受けず、常に at コマンドおよび batch コマンドを実行できます。

アクセス制御ファイルを変更した場合でも、at デーモン (atd) を再起動する必要はありません。アクセス制御ファイルは、ユーザーが at または batch のコマンドの実行を試みるたびに読み込まれます。

24.4. batch を使用した System Load Drop で実行するジョブのスケジュール設定

1 回限りのタスク (別名ジョブ) を、システムの平均負荷が指定値を下回ったときに実行するようスケジュール設定するときは、batch ユーティリティーを使用します。リソース負荷の高いタスクを実行したり、システムがアイドル状態になるのを防いだりするときに有用です。

ユーザーは、batch ユーティリティーを使用して batch ジョブを指定します。このジョブはその後 atd サービスにより実行されます。

24.4.1. Batch ジョブの前提条件

この batch ユーティリティーは at パッケージで提供され、batch ジョブは atd サービスで管理されます。そのため、batch ジョブの前提条件は at ジョブの前提条件と同じです。「at ジョブの前提条件」を参照してください。

24.4.2. Batch ジョブのスケジュール設定

  1. ジョブは常に複数のユーザーにより実行されます。希望するユーザーとしてログインし、以下を実行します。

    ~]# batch
  2. at> プロンプトが表示されたら、以下のコマンドを入力して実行し、Enter を押します。

    ~]# batch
    at> sh /usr/local/bin/my-script.sh

    実行したいすべてのコマンドにこの手順を繰り返します。

    注記

    at> プロンプトに、使用されるシェルが表示されます。

    warning: commands will be executed using /bin/sh

    batch ユーティリティーは、ユーザーの SHELL 環境変数にあるシェルのセット、ユーザーのログインシェル、または /bin/sh のうち最初に見つかったものを使用します。

  3. 空の行で Ctrl+D キーを押し、ジョブの指定を完了します。
注記

コマンドセットやスクリプトが標準出力に情報を表示しようとする場合、その出力はユーザーにメールで送信されます。

デフォルトのシステム負荷平均の制限の変更

デフォルトでは、batch ジョブはシステムの負荷平均が 0.8 を下回ったときに開始されます。この設定は、atq サービスでも維持されます。システム負荷の限界を変更するには、以下を行います。

  1. /etc/sysconfig/atd ファイルに、以下の行を追加します。

    OPTS='-l x'

    x を新しい負荷平均と置き換えます。以下に例を示します。

    OPTS='-l 0.5'
  2. atq サービスを再起動します。

    # systemctl restart atq
保留中のジョブの表示

保留中のジョブ一覧を表示するには、atq コマンドを使用します。「保留中のジョブの表示」を参照してください。

スケジュール設定したジョブの削除

スケジュールを設定したジョブを削除するには、atrm コマンドを使用します。「スケジュール設定したジョブの削除」を参照してください。

Batch へのアクセス制御

batch ユーティリティーの使用を制限することもできます。これは batch および at ユーティリティーのために一緒に行われます。「at と batch へのアクセスの制御」を参照してください。

24.5. systemd ユニットファイルを使用した次回ブート時のジョブの実行スケジュール

cronanacronatbatch ユーティリティーを使うと、特定の時間に、またはシステム負荷が特定のレベルに達したときに、ジョブを実行するように設定できます。また、次回のシステムブート時に実行するジョブを作成することもできます。これは、実行するスクリプトとその依存関係を指定する systemd ユニットファイルを作成することで行います。

次回の起動時に実行するスクリプトを設定するには、以下を実行します。

  1. 起動プロセスのどの段階でスクリプトを実行するかを指定する systemd ユニットファイルを作成します。この例で挙げているのは、Wants=After= の合理的な一連の依存関係を備えたユニットファイルです。

    ~]# cat /etc/systemd/system/one-time.service
    [Unit]
    # The script needs to execute after:
    # network interfaces are configured
    Wants=network-online.target
    After=network-online.target
    # all remote filesystems (NFS/_netdev) are mounted
    After=remote-fs.target
    # name (DNS) and user resolution from remote databases (AD/LDAP) are available
    After=nss-user-lookup.target nss-lookup.target
    # the system clock has synchronized
    After=time-sync.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/foobar.sh
    
    [Install]
    WantedBy=multi-user.target

    この例を使用すると、以下が可能となります。

  2. スクリプトの実行後も systemd サービスをアクティブな状態に保つには、[Service] セクションに RemainAfterExit=yes 行を追加します。

    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/usr/local/bin/foobar.sh
  3. systemd デーモンを再読み込みします。

    ~]# systemctl daemon-reload
  4. systemd サービスの有効化:

    ~]# systemctl enable one-time.service
  5. 以下を実行するスクリプトを作成します。

    ~]# cat /usr/local/bin/foobar.sh
    #!/bin/bash
    
    touch /root/test_file
  6. スクリプトを次回のブート時のみに実行したいときは、systemd ユニットを無効にする行を追加します。

    #!/bin/bash
    
    touch /root/test_file
    systemctl disable one-time.service
  7. スクリプトを実行可能にします。

    ~]# chmod +x /usr/local/bin/foobar.sh

24.6. 関連資料

Red Hat Enterprise Linux でシステムタスクを自動化する方法には、下記の参考文献をご覧ください。

インストールされているドキュメント

  • cron: crond デーモンの man ページでは、crond の仕組みと、その動作の変更方法を記載しています。
  • crontab : crontab ユーティリティーの man ページで、対応しているオプションの一覧を記載しています。
  • crontab(5): crontab ユーティリティーのマニュアルページのセクションに、crontab ファイルのフォーマットを記載しています。

このページには機械翻訳が使用されている場合があります (詳細はこちら)。