63.シェルスクリプトの自動実行(crond)

63.シェルスクリプトの自動実行(crond)

定められた時間にpingコマンドを発行するシェルスクリプトを自動実行させることにします。


自動実行には cronデーモン を用います。

cron とは、ジョブ(スクリプト)を自動実行するためのデーモンプロセスです。

Linux システムの管理を行なう場合、端末の起動確認やログのローテート、バックアップなど、定期的に自動実行したいジョブが数多くあります。特に、バックアップなどは、システムへの負荷が大きいため、通常は、ユーザからのアクセスが少ない、深夜や早朝に行なわれます。

このように、定期的に実行されるジョブは、crond というデーモンによって、自動的に行なうように管理することができます。そこで、今回は、cron の設定を行なうために必要なコマンドや、設定ファイルについて説明していきたいと思います。


cronの設定は crontab -e で cronjob を設定することで行います(ユーザ毎)。

cronjob は crontab -e コマンドを実行したときのユーザー権限で動作します。


■設定ファイルの書式

「/var/spool/cron/user」 ファイルがcrontab-eにより設定される 

crontabファイルでは、crond への命令を、「この日付のこの時刻に、このコマンドを実行して下さい。」といった形式で書き込みます。そして、ユーザは、それぞれのcrontabファイルを「/var/spool/cron」配下にuser という名前で所有しており、使用するコマンドは、そのcrontabファイルを所有しているユーザの権限で実行されるので、コマンド使用の際には注意が必要です。 

また、このファイルの中は、おおまかに、コメント行、環境変数の設定、cronコマンドの実行、のいずれかに分けることができ、その内容を記述します。なお、コメント行は、通常のファイルと同様に、先頭に '#' を書きます。 

なお、このファイルの作成/編集は、 'crontab -e' とコマンドを実行して行ないます。 


■環境変数の設定 

初めてcrontabファイルを編集した場合には、何も書かれていませんので、以下のフォーマットで記述します。また、各フィールドでは、 '*' を使用することが可能です。 

分 時 日 月 曜日 コマンド
表1

0~59
0~23
1~31
1~12 or jan~dec
曜日
0~7 [0,7は日曜日] or sun~sat
コマンド
有効なコマンドを記述します。空白を含むことも可能ですが、標準のBourne Shellの書式に従って記述します。
曜日の指定 月 火 水 木 金 土 日
      1 2 3 4 5 6 7


また、crontabファイルでは、リスト範囲の指定を行なうことができます。リストとは、一つのフィールドに対して、複数の値を設定することで、範囲とは、一つのフィールドに対して、特定の範囲の値を設定することです。そして、リストと範囲は、一つのフィールドに共存することもできます。さらに、間隔値(指定間隔に一度、処理を実行)を設定することもできます。 


表2

設定例
コメント
リスト
0,15,30,45
分フィールドで指定した場合、15分に一度処理を実行します。
範囲
1-5
曜日フィールドで指定した場合、月曜日~金曜日に処理を実行します。
共存
1,3,7-9
時間フィールドで指定した場合、1時、3時、7時、8時、9時に処理を実行します。
間隔値
1-5/2
時間フィールドで指定した場合、1時、3時、5時に処理を実行します。なお、間隔値は、「/」の後ろに指定した値の間隔で処理を実行します。



【演習1】

crondの設定演習

192.168.56.10へピングを打つシェルスクリプトを自動実行させる

以下、guestで接続して実行してください。


①シェルスクリプトの作成(これは以前viの練習の時に作っていますよ!)

(1)viをファイル名pingWin.shで起動し以下を入力します

#!/bin/bash
date       ← dateコマンドを付け加えてください
for i in {1..10}; 
do
ping -w 3 192.168.56.$i;  
done

(2)pingWin.shでファイルを保存します

:w pingWin.sh

(3)実行権を与えます

chmod 755 pingWin.sh

(4)フルパス形式で実行します

./pingWin.sh




②cronjobで自動実行を行う

○cronjobの作成(毎日3時30分と12時30に実行する)

[guest@aso ~]$ crontab -e
no crontab for guest - using an empty one
crontab: installing new crontab
[guest@aso ~]$


○cronjobの内容確認
結果はファイルにリダイレクトしています

[guest@aso ~]$ crontab -l
30 3,12 * * * /home/guest/pingWin.sh > /home/guest/ping_result.log
[guest@aso ~]$


○パーミッションを変更する

[guest@aso ~]$ chmod 757 pingWin.sh
[guest@aso ~]$ ls -al pingWin.sh
-rwxr-xrwx 1 guest guest 70 12月 29 16:08 pingWin.sh
[guest@aso ~]$


○実行テストの実施(現在時刻の2分後を設定して確認)

シェルスクリプトの内容をヤンクとペーストで1行コピーして現在時刻の2分後を設定

[root@guest ~]# date
2015年  1月 19日 月曜日 16:03:25 JST
[root@guest ~]# crontab -e
30 3,12 * * * /home/guest/pingWin.sh > /home/guest/ping_result.log
05 16 * * * /home/guest/pingWin.sh > /home/guest/ping_result.log
[root@guest ~]#


○結果確認
時間が来たらログを確認します

[guest@aso ~]$ ls -al ping_result.log
-rw-r--r-- 1 guest guest 2094 12月 29 16:05 ping_result.log
[guest@aso ~]$

2分後のpingのログファイルの状態をタイムスタンプから確認する
またcatコマンドで内容も確認する


○うまく動かないとき

・crondが動いているか確認する

・実行ファイルの権限が757を確認する

・/var/log/cron を確認する

・CentOSの時刻が合っているか確認する


【演習2】

cronの実行結果をメールでお知らせする

crontab -e で設定ファイルの1行目に  MAILTO="guest"  を追加する
05 16 * * * /home/guest/pingWin.sh  に変更する(> /home/guest/ping_result.logを削除する
➂実行時間を現在時刻の2分後に設定する
④2分後にメールの着信と内容を確認する
メールの着信内容を表示してスクリーンショットを撮り個人チャットへ報告する
⑥MAILTO="guest"をMAILTO=""に変更しておく