第24章 システムタスクの自動化
Red Hat Enterprise Linux は、タスク (ジョブ とも呼ばれます) を自動的に実行するように設定できます。
- 指定した時間に定期的に実行するには cron を使用します。「cron を使用した繰り返しジョブのスケジュール設定」 を参照してください。
- 特定の日に非同期的に実行するには、anacron を使用します。「Anacron を使用した繰り返しの非同期ジョブのスケジュール設定」 を参照してください。
- 特定の時間に 1 回実行するには at を使用します。「at を使用した特定の時間にジョブを実行するスケジュールの設定」 を参照してください。
- システムの負荷平均が指定した値を下回ったときに 1 回実行するには batch を使用します。「batch を使用した System Load Drop で実行するジョブのスケジュール設定」 を参照してください。
- 次回のブート時に 1 回実行するときは、「systemd ユニットファイルを使用した次回ブート時のジョブの実行スケジュール」 を参照してください。
本章では、これらのタスクの実行方法を説明します。
24.1. cron を使用した繰り返しジョブのスケジュール設定
Cron
は、タスク (別名ジョブ) を定期的に実行するためにスケジュールを設定するサービスです。cron
のジョブは、設定した時間にシステムが稼働している場合のみ実行されます。システムの起動時まで実行を延期して、システムが稼動していない場合にジョブが「消失」しないようにするスケジューの設定の方法は 「at を使用した特定の時間にジョブを実行するスケジュールの設定」 を参照してください。
ユーザーは、cron テーブルファイル (crontab
ファイルとも呼ばれます) で cron ジョブを指定します。その後、これらのファイルは crond
サービスが読み取り、ジョブを実行します。
24.1.1. cron ジョブの前提条件
cron
ジョブのスケジュール設定を行う前に、以下を行います。
cronie パッケージをインストールします。
~]# yum install cronie
crond
サービスはインストール時に有効になっており、ブート時に自動的に開始するように設定されています。サービスを無効にしている場合は有効にしてください。~]# systemctl enable crond.service
現在のセッションで
crond
サービスを開始します。~]# systemctl start crond.service
(オプション) cron を設定します。たとえば、以下を変更できます。
- ジョブの実行時に使用するシェル
-
PATH
環境変数 ジョブが E メールを送信する場合はメールアドレス
cron
の設定に関する詳細は、crontab(5) man ページを参照してください。
24.1.2. cron ジョブのスケジュール設定
root ユーザーとしてジョブをスケジュール設定する
root
ユーザーは /etc/crontab
にある cron テーブルを使用しますが、/etc/cron.d/
に cron テーブルファイルを作成することを推奨します。root
としてジョブをスケジュール設定するときは、この方法を使用します。
以下を選択します。
-
ジョブを実行する時刻 (分)。たとえば、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 *
-
ジョブを実行する時刻 (分)。たとえば、10分間隔で指定する場合は
-
ユーザーを指定します。ジョブは、このユーザーが実行したように実行されます。たとえば、
root
公開鍵の値を上書きするには、 -
実行するコマンドを指定します。たとえば、
/usr/local/bin/my-script.sh
を使用します。 上記の指定を 1 行にまとめると、以下のようになります。
0,10,20,30,40,50 17-20 15 Jun,Jul,Aug * root /usr/local/bin/my-script.sh
-
完成した行を
/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 ジョブを特定のユーザーとして作成するには、以下を使用します。
ユーザーのシェルから以下を実行します。
[bob@localhost ~]$
crontab -e
これにより、
VISUAL
またはEDITOR
環境変数により指定したエディターを使用して、ユーザーが自分でcrontab
ファイルを編集できます。???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
- ファイルを保存して、エディターを終了します。
(オプション) 新しいジョブを確認するときは、以下を実行し、現在のユーザーの crontab ファイルの内容を表示します。
[bob@localhost ~]$
crontab -l
@daily /home/bob/bin/script.sh
ジョブの時間、日、週、月ごとのスケジュール設定
ジョブを時間、日、週、または月ごとにスケジュールするには、以下を実行します。
- ジョブに実行させたいアクションをシェルスクリプトに入力します。
シェルスクリプトを以下のディレクトリーのうちの 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 つの方法で、anacron
は cron
とは異なります。
-
予定した時間にシステムが稼働していなかった場合、
anacron
のジョブはシステムが稼働するまで延期されます。 -
anacron
のジョブは、最大で 1 日 1 回実行することができます。
ユーザーは、anacrontab
ファイルとも呼ばれる anacron テーブルファイルで anacron ジョブを指定します。その後、これらのファイルは crond
サービスが読み取り、ジョブを実行します。
24.2.1. Anacrob ジョブの前提条件
anacron
ジョブのスケジュール設定を行う前に、以下を行います。
cronie-anacron パッケージがすでにインストールされていることを確認します。
~]# rpm -q cronie-anacron
cronie-anacron はすでにインストールされる可能性があります。これは、cronie パッケージのサブパッケージであるためです。インストールされていない場合は、以下のコマンドを使用します。
~]# yum install cronie-anacron
crond
サービスはインストール時に有効になっており、ブート時に自動的に開始するように設定されています。サービスを無効にしている場合は有効にしてください。~]# systemctl enable crond.service
現在のセッションで
crond
サービスを開始します。~]# systemctl start crond.service
(オプション) 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
、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
-
ジョブを実行する頻度。たとえば、毎日を指定する場合は
-
作成された行を
/etc/anacrontab
に追加します。
これでジョブはスケジュールされたとおりに実行されます。
簡単なジョブの例は、/etc/anacrontab
ファイルを参照してください。ジョブの指定方法に関する詳細は、anacrontab(5) man ページを参照してください。
ジョブの時間、日、週、月ごとのスケジュール設定
ジョブは、anacron を使用して日、週、月ごとにスケジュールを設定できます。「ジョブの時間、日、週、月ごとのスケジュール設定」を参照してください。
24.3. at を使用した特定の時間にジョブを実行するスケジュールの設定
1 回限りのタスク (別名ジョブ) を指定した時間に 1 回実行するようスケジュール設定するときは、at
ユーティリティーを使用します。
ユーザーは、at ユーティリティーを使用して at
ジョブを指定します。このジョブはその後 atd
サービスにより実行されます。
24.3.1. at ジョブの前提条件
at
ジョブのスケジュール設定を行う前に、以下を行います。
at パッケージをインストールします。
~]# yum install at
atd
サービスはインストール時に有効になっており、ブート時に自動的に開始するように設定されています。サービスを無効にしている場合は有効にしてください。~]# systemctl enable atd.service
現在のセッションで
atd
サービスを開始します。~]# systemctl start atd.service
24.3.2. at ジョブのスケジュール設定
ジョブは常に複数のユーザーにより実行されます。希望するユーザーとしてログインし、以下を実行します。
~]# 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
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
の、いずれか最初に発見されたものを使用します。- 空の行で 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
ジョブであるかどうかを指定します。a
は at
を表します。b
は batch
を表します。
非 root ユーザーが閲覧できるのは、自分のジョブのみです。root ユーザーは、すべてのユーザーのジョブを閲覧できます。
スケジュール設定したジョブの削除
スケジュール設定したジョブを削除するには、以下を行います。
atq
コマンドを使用して、保留中のジョブを一覧表示します。~]# atq 26 Thu Feb 23 15:00:00 2017 a root 28 Thu Feb 24 17:30:00 2017 a root
- スケジュールを設定した時間とユーザーを使用しえ、削除するジョブを検索します。
ジョブを番号で指定し、
atrm
コマンドを実行します。~]# atrm 26
24.3.2.1. at と batch へのアクセスの制御
特定ユーザーによる at
と batch
コマンドへのアクセスを制限できます。そのためには、以下のルールに従ってユーザー名を /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 ジョブのスケジュール設定
ジョブは常に複数のユーザーにより実行されます。希望するユーザーとしてログインし、以下を実行します。
~]# batch
at>
プロンプトが表示されたら、以下のコマンドを入力して実行し、Enter を押します。~]# batch at> sh /usr/local/bin/my-script.sh
実行したいすべてのコマンドにこの手順を繰り返します。
注記at>
プロンプトに、使用されるシェルが表示されます。warning: commands will be executed using /bin/sh
batch ユーティリティーは、ユーザーの SHELL 環境変数にあるシェルのセット、ユーザーのログインシェル、または
/bin/sh
のうち最初に見つかったものを使用します。- 空の行で Ctrl+D キーを押し、ジョブの指定を完了します。
コマンドセットやスクリプトが標準出力に情報を表示しようとする場合、その出力はユーザーにメールで送信されます。
デフォルトのシステム負荷平均の制限の変更
デフォルトでは、batch
ジョブはシステムの負荷平均が 0.8 を下回ったときに開始されます。この設定は、atq
サービスでも維持されます。システム負荷の限界を変更するには、以下を行います。
/etc/sysconfig/atd
ファイルに、以下の行を追加します。OPTS='-l x'
x を新しい負荷平均と置き換えます。以下に例を示します。
OPTS='-l 0.5'
atq
サービスを再起動します。# systemctl restart atq
保留中のジョブの表示
保留中のジョブ一覧を表示するには、atq
コマンドを使用します。「保留中のジョブの表示」を参照してください。
スケジュール設定したジョブの削除
スケジュールを設定したジョブを削除するには、atrm
コマンドを使用します。「スケジュール設定したジョブの削除」を参照してください。
Batch へのアクセス制御
batch
ユーティリティーの使用を制限することもできます。これは batch
および at
ユーティリティーのために一緒に行われます。「at と batch へのアクセスの制御」を参照してください。
24.5. systemd ユニットファイルを使用した次回ブート時のジョブの実行スケジュール
cron、anacron、at、batch ユーティリティーを使うと、特定の時間に、またはシステム負荷が特定のレベルに達したときに、ジョブを実行するように設定できます。また、次回のシステムブート時に実行するジョブを作成することもできます。これは、実行するスクリプトとその依存関係を指定する systemd
ユニットファイルを作成することで行います。
次回の起動時に実行するスクリプトを設定するには、以下を実行します。
起動プロセスのどの段階でスクリプトを実行するかを指定する
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
この例を使用すると、以下が可能となります。
-
スクリプト名に
/usr/local/bin/foobar.sh
を置き換えます。 必要に応じて
After=
エントリーのセットを変更します。起動プロセスの段階を指定する方法は 「systemd のユニットファイルの作成および変更」 を参照してください。
-
スクリプト名に
スクリプトの実行後も
systemd
サービスをアクティブな状態に保つには、[Service]
セクションにRemainAfterExit=yes
行を追加します。[Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/local/bin/foobar.sh
systemd
デーモンを再読み込みします。~]# systemctl daemon-reload
systemd
サービスの有効化:~]# systemctl enable one-time.service
以下を実行するスクリプトを作成します。
~]# cat /usr/local/bin/foobar.sh #!/bin/bash touch /root/test_file
スクリプトを次回のブート時のみに実行したいときは、
systemd
ユニットを無効にする行を追加します。#!/bin/bash touch /root/test_file systemctl disable one-time.service
スクリプトを実行可能にします。
~]# chmod +x /usr/local/bin/foobar.sh
24.6. 関連資料
Red Hat Enterprise Linux でシステムタスクを自動化する方法には、下記の参考文献をご覧ください。
インストールされているドキュメント
-
cron: crond デーモンの man ページでは、
crond
の仕組みと、その動作の変更方法を記載しています。 - crontab : crontab ユーティリティーの man ページで、対応しているオプションの一覧を記載しています。
-
crontab(5): crontab ユーティリティーのマニュアルページのセクションに、
crontab
ファイルのフォーマットを記載しています。
このページには機械翻訳が使用されている場合があります (詳細はこちら)。