107.2 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
107 管理タスク |
Objective: |
107.2 ジョブをスケジュールしてシステム管理タスクを自動化する |
Lesson: |
1 of 2 |
はじめに
優れたシステム管理者の最も重要な仕事の一つは、定期的に実行しなければならないジョブをスケジュールすることです。例えばシステム管理者は、バックアップ、システムのアップグレードなど、多くの繰り返し作業を自動的に実行するジョブを作成することができます。これには、cron
機能を用いて、定期的なジョブをスケジュールします。
cronでジョブをスケジュールする
cron
(クローン)は常時稼働し続けるデーモンで、1分ごとに起動して、一連のテーブルから実行すべきタスクを探します。これらのテーブルは crontabs と呼ばれていて、いわゆる クローンジョブ を含んでいます。cronは、スケジュールした時刻にシステムが稼働している場合にのみクローンジョブを実行するので、常に電源が入っているサーバーシステムに適しています。システムのcrontabを管理するrootユーザーだけでなく、一般ユーザーも独自の crontab
を作って cron
を利用することができます。
Note
|
Linuxには |
ユーザーのcrontab
ユーザーがcronジョブのスケジュールを定義するテキストファイルを、ユーザーcrontabs
と呼びます。作成したユーザーアカウントと同名のファイルで、通常は /var/spool/cron
のサブディレクトリに置かれますが、ファイルの位置はディストリビューションによって異なります。
ユーザーcrontabの各行には、空白で区切った6つのフィールドが含まれています。
-
時刻の分(0-59)
-
日の時刻(0〜23)
-
月の日付(1-31)
-
年の月(1-12)
-
曜日(0-7、日曜日が0ないし7)
-
実行するコマンド
月と曜日は、対応する数値の代わりに名前の最初の3文字でも指定できます。
最初からの5つのフィールドでいつ実行するかを、6番目のフィールドで実行するコマンドをそれぞれ指示します。実行タイミングを指示する5つのフィールドには、範囲や複数の値を含めることができます。よく使われるものを示します:
*
(アスタリスク)-
任意の値を示します。毎分、毎時、毎月曜などの、定期的な繰り替えを指示するときに便利です。たとえば
30 12 * * 0
で、毎日曜日の12時30分を指定します。 ,
(コンマ)-
複数の値を区切ります。たとえば
0,30 * * * *
で、毎時0分と30分を指定します。 -
(ダッシュ)-
値の範囲を指定します。たとえば
0 9-17 * * 1-6
で、平日(月〜金曜)9時〜17時の、毎0分を指定します。 /
(スラッシュ)-
値の増分(間隔)を指定します。たとえば
*/5 * * * *
で、5分毎を指定します。
システム全体用のcrontabファイルである /etc/crontabs
の書式はユーザーcrontabファイルとは異なるのですが、実行タイミングを指示する5つのフィールドについては同じです。分かりやすいコメントが書かれているので見てみましょう。以下は、Debianの /etc/crontab
ファイルの先頭部分です。
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # 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
システムのcrontab
システムレベルのcronジョブのスケジュールを定義するテキストファイルを、システムcrontabs と呼び、rootユーザーのみが編集できます。/etc/crontab
と /etc/cron.d
ディレクトリ内のすべてのファイルが、システムcrontabsです。
ほとんどのディストリビューションには、/etc/cron.hourly
、 /etc/cron.daily
、 /etc/cron.weekly
、 /etc/cron.monthly
ディレクトリがあり、それぞれに所定の頻度で実行されるスクリプトが含まれています。たとえば、毎日実行するスクリプトは、/etc/cron.daily
に置かれています。
Warning
|
一部のディストリビューションでは、 |
システムcrontabsの書式はユーザーcrontabsに似ていますが、cronジョブを実行するユーザーを指定するフィールドが追加されています。つまり、システムcrontabsの各行には、空白で区切った7つのフィールドが含まれています。
-
時刻の分(0-59)
-
日の時刻(0〜23)
-
月の日付(1-31)
-
年の月(1-12)
-
曜日(0-7、日曜日が0ないし7)
-
コマンドを実行するユーザーアカウント名
-
実行するコマンド
ユーザーcrontabと同様に、*
、,
、-
、/
を使用して、実行タイミングフィールドに複数の値を指定できます。また、対応する数字の代わりに、名前の最初の3文字で月と曜日を指定することもできます。
特別な時間の指定方法
crontabsファイルでは、実行タイミング指定の5フィールドに、よく使われる特別な短縮表記を使用できます。
@reboot
-
再起動後に、指定したタスクを1回実行します。
@hourly
-
指定されたタスクを毎時0分に実行します。
@daily
(または@midnight
)-
指定されたタスクを毎日0時0分に実行します。
@weekly
-
指定されたタスクを週に1回、日曜日の0時0分に実行します。
@monthly
-
指定されたタスクを毎月、1日の0時0分に実行します。
@yearly
(または@annually
)-
指定されたタスクを毎年、1月1日0時0分に実行します。
Crontabの変数
crontabファイルには、スケジュールするタスクを宣言する前に、環境変数を割り当てることができます。あらかじめ設定されていることが多い環境変数を以下に示します:
HOME
-
cron
がコマンドを呼び出す際のワーキングディレクトリ(デフォルトではユーザーのホームディレクトリ)。 MAILTO
-
標準出力とエラー出力をメールで送信するユーザー名ないしメールアドレス(デフォルトではcrontabの所有者)。コンマで区切って複数の値を指定することもでき、空の場合はメールを送信しません。
PATH
-
コマンドを探すパス。
SHELL
-
使用するシェル(デフォルトでは
/bin/sh
)。
ユーザーcronジョブの作成
個人用のcrontabファイルを設定するには、crontab
コマンドを使います。crontab -e
コマンドを実行すると、独自のcrontabファイルを編集したり、まだ存在しない場合は作成したりできます。
$ crontab -e no crontab for frank - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ‑‑‑‑ easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
crontab
コマンドは、VISUAL
ないし EDITOR
環境変数で指定されたエディタをデフォルトで開きます。したがって、好みのエディタでcrontabファイルの編集を行えます。上記の例のように、crontab
を初めて実行するときに、リストからエディタを選択できるディストリビューションもあります。
ホームディレクトリにある foo.sh
スクリプトを毎日午前10時に実行する場合は、crontabファイルに次の行を追加します:
0 10 * * * /home/frank/foo.sh
以下に示すcrontabエントリを見てみましょう:
0,15,30,45 08 * * 2 /home/frank/bar.sh 30 20 1-15 1,6 1-5 /home/frank/foobar.sh
1行目は、毎週火曜日の午前8時、午前8時15分、午前8時30分、午前8時45分に、bar.sh
スクリプトを実行することを指示しています。2行目は、1月と6月の1日から15日までの間の月曜日から金曜日の午後8時30分に、foobar.sh
スクリプトを実行することを指示しています。
Warning
|
crontabファイルを手作業で編集することもできますが、常に |
上記の -e
オプション意外にも、crontab
コマンドには便利なオプションが備わっています:
-l
-
現在のcrontabを標準出力に表示します。
-r
-
現在のcrontabを削除します。
-u
-
このオプションで指定したユーザーのcrontabファイルを操作します。このオプションにはroot権限が必要であり、rootユーザーが一般ユーザーのcrontabファイルを編集するために使用します。
システムcronジョブの作成
一般ユーザーのcrontabsとは異なり、システムのcrontabsはエディタを使って直接編集します。つまり、/etc/crontab
や /etc/cron.d
内のファイルを編集するために、crontab
コマンドを使うことはありません。システムcrontabsを編集するときは、cronジョブを実行するユーザー(通常はroot)を指定する必要があることに注意してください。
たとえば、/root
ディレクトリにある barfoo.sh
スクリプトを毎日午前1時30分に実行する場合は、好みのエディタで /etc/crontab
を開き、次の行を追加します:
30 01 * * * root /root/barfoo.sh >>/root/output.log 2>>/root/error.log
この例では、ジョブの標準出力を /root/output.log
に追加し、エラー出力を /root/error.log
に追加します。
Warning
|
上記の例のように出力をファイルにリダイレクトしない限り(そして |
ジョブスケジューリングへのアクセスを制限する
Linuxでは、/etc/cron.allow
ファイルと /etc/cron.deny
ファイルを使用して、ユーザー毎に crontab
の利用を制限することができます。/etc/cron.allow
が存在する場合、その中にリストされているユーザーとrootのみが、crontab
コマンドを使用してジョブをスケジュールできます。/etc/cron.allow
は存在しないが /etc/cron.deny
が存在する場合、このファイルにリストされている一般ユーザーは、crontab
コマンドを使用してジョブをスケジュールできません(空の /etc/cron.deny
は、すべての一般ユーザーが crontab
を使用してジョブをスケジュールできることを意味します)。どちらのファイルも存在しない場合の挙動は、ディストリビューションによって異なります。
Note
|
|
cronの代替
サービスマネージャとしてsystemdを採用しているマシンでは、cron
の代わりに タイマー をセットしてタスクをスケジュールできます。タイマーは、サフィックスが .timer
であるsystemdユニットファイルで、タイマーが発動したときに実行するタスクを記述したユニットファイルとペアで存在する必要があります。timer
はデフォルトで、サフィックス以外は同じ名前のサービスユニットを起動します。
タイマーには、ジョブをいつ実行するかを指定する [Timer]
セクションが含まれます。具体的には、OnCalendar=
オプションを使用して、cronジョブと同様に動作する リアルタイムタイマー を(カレンダーイベント表記を用いて)定義できます。OnCalendar=
オプションは、次の書式で指定します。
DayOfWeek Year-Month-Day Hour:Minute:Second
DayOfWeek
(曜日)は省略可能です。*
、/
、,
オペレータは、cronジョブのものと同じ意味を持ちますが、連続する範囲を示すには ..
を使用します。曜日は、英単語ないしその最初の3文字で指定します。
Note
|
ある開始時点(たとえば、マシンが起動したときや、タイマー自体がアクティブになったとき)から一定時間経過した後に実行される モノトニックタイマー (monotonic timer)を定義することもできます。 |
たとえば、毎月第1月曜日の05:30に /etc/systemd/system/foobar.service
という名前のサービスを実行する場合は、対応する /etc/systemd/system/foobar.timer
に次の行を記入します。
[Unit] Description=Run the foobar service [Timer] OnCalendar=Mon *-*-1..7 05:30:00 Persistent=true [Install] WantedBy=timers.target
新しいタイマーを作成したら、rootとして次のコマンドを実行してタイマーを有効にして開始します。
# systemctl enable foobar.timer # systemctl start foobar.timer
スケジュールされたジョブの頻度を変更するには、OnCalendar
の値を変更してから、systemctl daemon-reload
コマンドを実行します。
最後に、アクティブなタイマーのリストを、実行される順にソートして表示するには、systemctl list-timers
コマンドを使用します。アクティブではないタイマーユニットも表示するには、--all
オプションを追加します。
Note
|
タイマーはsystemdジャーナルに記録されるので、さまざまなユニットのログを |
OnCalender=
には、上記の正規化された長い形式に代えて、ジョブの実行頻度を指定する簡単な短縮表記も使えます。
hourly
-
指定されたタスクを毎時0分に実行します。
daily
-
指定されたタスクを毎日0時0分に実行します。
weekly
-
指定されたタスクを週に1回、月曜日の0時0分に実行します。(訳注: cronの@weeklyは日曜日であることに注意してください)。
monthly
-
指定されたタスクを毎月、1日の0時0分に実行します。
yearly
-
指定されたタスクを毎年、1月1日の0時0分に実行します。
日時の指定ではタイムゾーンを指定することもできます。詳細は systemd.timer(7)
のマニュアルページを参照してください。
演習
-
以下に示す
crontab
の短縮表記について、同じ意味の時間指定(ユーザーcrontab
ファイルの先頭5列)を示してください。@hourly
@daily
@weekly
@monthly
@annually
-
以下に示す
OnCalendar
の短縮表記について、同じ意味の時間指定(正規化された長い形式)を示してください。hourly
daily
weekly
monthly
yearly
-
crontab
ファイルにある次の時間指定の意味を説明してください。30 13 * * 1-5
00 09-18 * * *
30 08 1 1 *
0,20,40 11 * * Sun
00 09 10-20 1-3 *
*/20 * * * *
-
タイマーユニットファイルの
OnCalendar
に指定する、次の時間指定の意味を説明してください。*-*-* 08:30:00
Sat,Sun *-*-* 05:00:00
*-*-01 13:15,30,45:00
Fri *-09..12-* 16:20:00
Mon,Tue *-*-1,15 08:30:00
*-*-* *:00/05:00
発展演習
-
cron
を使用してジョブをスケジュールすることを許可された一般ユーザーが、自分のcrontabファイルを作成するコマンドは何ですか? -
毎週金曜日の午後1時に
date
コマンドを実行する単純なジョブをスケジュールして下さい。このジョブの出力を確認するにはどうしますか? -
foobar.sh
スクリプトを1分ごとに実行し、その標準出力をホームディレクトリのoutput.log
ファイルに書き込み、標準エラー出力をメールで送信するジョブを追加して下さい。 -
前問で追加した
crontab
エントリを参照して下さい。標準出力を保存するファイルを絶対パスで指定する必要がないのはなぜですか? また、./foobar.sh
コマンドでスクリプトを実行できるのはなぜですか? -
追加した
crontab
エントリから出力リダイレクトを削除すると共に、1番目のcronジョブを無効にして下さい。 -
ジョブの標準出力とエラー出力を、電子メールでユーザー
emma
に送信するにはどうしますか? また、それらのいずれも送信しないようにするにはどうしますか? -
コマンド
ls -l /usr/bin/crontab
を実行して下さい。設定されている特別なパーミッションと、その意味は何ですか?
まとめ
このレッスンでは、以下の事柄を学びました。
-
定期的にジョブを実行するために
cron
を使用すること。 -
cronジョブの管理方法。
-
cronジョブをスケジュールできるユーザーの制限方法。
-
cron
の代わりとなる systemdタイマーユニットの働き。
このレッスンでは、以下に示すコマンドとファイルについて説明しました。
crontab
-
一般ユーザーの
crontab
ファイルを保守します。 /etc/cron.allow
と/etc/cron.deny
-
crontab
コマンドの実行を制限するために使用するファイル。 /etc/crontab
-
システムcrontabファイル。
/etc/cron.d
-
システムcrontabsファイルを置くディレクトリ。
systemctl
-
systemdとサービスマネージャーを制御します。タイマーユニットを有効にして起動する場合などに使用します。
演習の解答
-
以下に示す
crontab
の短縮表記について、同じ意味の時間指定(ユーザー crontab ファイルの最初の5列)を示してください。@hourly
0 * * * *
@daily
0 0 * * *
@weekly
0 0 * * 0
@monthly
0 0 1 * *
@annually
0 0 1 1 *
-
以下に示す
OnCalendar
の短縮表記について、同じ意味の時間指定(正規化された長い形式)を示してください。hourly
*-*-* *:00:00
daily
*-*-* 00:00:00
weekly
Mon *-*-* 00:00:00
monthly
*-*-01 00:00:00
yearly
*-01-01 00:00:00
-
crontab
ファイルにある次の時間指定の意味を説明してください。30 13 * * 1-5
月曜日から金曜日の午後1時30分
00 09-18 * * *
毎日午前9時から午後6時までの0分
30 08 1 1 *
1月1日の午前8時30分
0,20,40 11 * * Sun
毎週日曜日の午前11:00、午前11:20、午前11:40
00 09 10-20 1-3 *
1月、2月、3月の、10日から20日までの午前9時0分
*/20 * * * *
20分ごと
-
タタイマーユニットファイルの
OnCalendar
に指定する、次の時間指定の意味を説明してください。*-*-* 08:30:00
毎日午前8時30分
Sat,Sun *-*-* 05:00:00
土曜日と日曜日の午前5時
*-*-01 13:15,30,45:00
毎月1日の午後1時15分、午後1時30分、午後1時45分
Fri *-09..12-* 16:20:00
9月、10月、11月、12月の毎週金曜日の午後4時20分
Mon,Tue *-*-1,15 08:30:00
毎月1日、15日が、月曜日ないし火曜日である日の、午前8時30分
*-*-* *:00/05:00
5分ごと
発展演習の解答
-
cron
を使用してジョブをスケジュールすることを許可された一般ユーザーが、自分のcrontabファイルを作成するコマンドは何ですか?dave@hostname ~ $ crontab -e no crontab for dave - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ---- easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
-
毎週金曜日の午後1時に
date
コマンドを実行する単純なジョブをスケジュールして下さい。このジョブの出力を確認するにはどうしますか?00 13 * * 5 date
出力はユーザーにメールで送信されます。表示するには、
mail
コマンドを使います。 -
foobar.sh
スクリプトを1分ごとに実行し、その標準出力をホームディレクトリのoutput.log
ファイルに書き込み、標準エラー出力をメールで送信するジョブを追加して下さい。*/1 * * * * ./foobar.sh >> output.log
-
前問で追加した crontab エントリを参照して下さい。標準出力を保存するファイルを絶対パスで指定する必要がないのはなぜですか? また、./foobar.sh コマンドでスクリプトを実行できるのはなぜですか?
crontab
ファイル内のHOME
環境変数で別の場所が指定されていなければ、cron
はユーザーのホームディレクトリをカレントディレクトリとしてコマンドを呼び出します。したがって、相対パスで出力ファイルを指定し、./foobar.sh
でスクリプトを指定できます。 -
追加した
crontab
エントリから出力リダイレクトを削除すると共に、1番目のcronジョブを無効にして下さい。#00 13 * * 5 date */1 * * * * ./foobar.sh
cronジョブを無効にするには、
crontab
ファイル内の対応する行をコメントにします。 -
ジョブの標準出力とエラー出力を、電子メールでユーザー emma に送信するにはどうしますか? また、それらのいずれも送信しないようにするにはどうしますか?
標準出力とエラー出力を
emma
に送信するには、crontab
ファイルでMAILTO
環境変数を次のように設定します。MAILTO="emma"
cron
にメールを送信させないためには、MAILTO
環境変数に空の値を割り当てます。MAILTO=""
-
コマンド ls -l /usr/bin/crontab を実行して下さい。設定されている特別なパーミッションと、その意味は何ですか?
$ ls -l /usr/bin/crontab -rwxr-sr-x 1 root crontab 25104 feb 10 2015 /usr/bin/crontab
crontab
コマンドにはSGIDビットが設定されています(グループの実行可能ビットがs
)。これは、コマンドが所有グループの権限(ここではcrontab
)で実行されることを意味します。そのため、一般ユーザーがcrontab
コマンドを実行した時でも、crontab
ファイルを編集できます。多くのディストリビューションでは、crontab
ファイルを編集できるのはcrontab
コマンドのみとなるように、ファイルのパーミッションが設定されています。