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

Red Hat Enterprise Linux は、タスク (ジョブ とも呼ばれます) を自動的に実行するように設定できます。
本章では、これらのタスクの実行方法を説明します。

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

cron は、タスク (別名ジョブ) を定期的に実行するためにスケジュールを設定するサービスです。cron のジョブは、設定した時間にシステムが稼働している場合のみ実行されます。システムの起動時まで実行を延期して、システムが稼動していない場合にジョブが「消失」しないようにするスケジューの設定の方法は 「at を使用した特定の時間にジョブを実行するスケジュールの設定」 を参照してください。
ユーザーは、cron テーブルファイル (crontab ファイルとも呼ばれます) で cron ジョブを指定します。その後、これらのファイルは crond サービスが読み取り、ジョブを実行します。

23.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 の設定に関する詳細は、man ページの crontab(5) を参照してください。

23.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 テーブルファイルを作成し、この行を追加します。後者が推奨されます。
これでジョブはスケジュールされたとおりに実行されます。
ジョブの指定方法に関する詳細は、man ページの crontab(5) を参照してください。基本的情報は /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. Scheduling a cron Job as root user にある方法と同じ方法でジョブを指定します。ただしユーザー名のフィールドは省略します。たとえば、以下を追加する代わりに、
    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 ディレクトリーにあるスクリプトを、対応する時間に自動的に実行します。