Linuxサーバ運用マニュアル

cronで監視しよう!

前回までに,定常運用編として,さまざまなコマンドなどを紹介してきました。それを定期的に実行してサーバ管理,運用していくわけですが,手動でそれらを行なうのはとても大変であり,ミスも発生しやすくなります。

cronを使ってそれらを自動化すれば,管理を容易にすると同時にミスを減らすことが可能です。ここでは,cronの設定方法と,それによってどのようにコマンドを組み合わせてサーバ監視していくかを解説します。

cronの設定方法

cronとは,Linuxの内蔵時計によって,指定された時間に指定のコマンドを実行するためのシステムです。 実際に使用するには,crontabコマンドかatコマンドで時間とコマンドを設定します。crontabは定期的に実行させたい場合, atは,1回だけ実行させたい場合に使用します。これらの情報は,各ユーザごとに存在し,cronデーモンによって実行されます。

cron概念図

crontab

定期的に同じコマンドを実行させることができるため,サーバ理にはこちらの方が有効です。オプションなしでは実行できません。主なオプションには,-l(list:リスト表示)-e(edit:エディット)があります。

Linux> crontab [オプション]

crontab -e を使ってcrontabを編集する際は,環境変数EDITORで指定されたエディタが使用されます。デフォルトでは,viになっています。


crontabは,具体的には,
分 時 日 月 曜 コマンド
という形式で指定し,そこで指定された時間になったら指定されたコマンドを実行します。「*」で任意の時間,「,」で並列指定,「-」で範囲指定など,いくつかの指定方法があります。具体的には下記の例を参考にしてください。

# 毎日午前6時10分にcommandを実行します。
10 6 * * * command

# 30分ごとにcommandを実行します。
0,30 * * * * command

# 2時間ごとにcommandを実行します。
0 */2 * * * command

# 毎週月曜日午前0時にcommandを実行します。
0 0 * * Mon command

# 毎月1日午前0時にcommandを実行します。
0 0 1 * * command

# 月曜日から金曜日の,午前11時にcommandを実行します。
0 11 * * mon-fri command

# 1月1日の午前0時にcommandを実行します。
0 0 1 jan * command

at

指定した時間に1度だけコマンドを実行させます。以下の形式で実行され,コマンドは標準入力から読み取ります。

Linux> at [オプション] time

timeには,時間を指定し,時刻と日付を指定することができます。主なオプションとしては,-f(file:ジョブをファイルから読み込み),-l(list:ジョブ表示)-d(delete:ジョブ削除)などがあります。

時間は,hh:mmのかたちで指定され,デフォルトでは時間(hh)は24時間形式です。日付は,month num[,year]のかたちで指定します。月(month)は英語名を使います。(最初3文字に省略することもできます)具体的には下記の例を参考にしてください。

Linux> at -f job.sh 15:20
15時20分にjob.sh内のコマンドを実行します。

Linux> at 00:00 Jan 1
1月1日0時0分にコマンドを実行します。

Linux> at 20 Saturday
次の土曜日の20時に,コマンドを実行します。


なお,実行されていないジョブを表示するには,atqコマンドか,at -l を使用します。

Linux> atq
Date                    Owner   Queue   Job#
15:20:00 06/07/99       root    c       5
00:00:00 01/01/00       root    c       6


ジョブを削除するときには,atrmコマンドか,at -d を使用します。

Linux> atrm [ジョブ番号]

ジョブ番号は,atqコマンドで表示されている値です。

cronでコマンドを実行する際の注意

cronでコマンドを実行するときと,コマンドラインで実行するときにはいくつか違いがあるので注意が必要です。

topやviなどの画面系のコマンドは使用できません。

また,crontabの場合,/bin/sh -c [コマンド]の形式で実行されるため,bashで動作しないコマンドは使えませんし,コマンドはフルパスで書かなければいけません。環境変数なども大きく異なってきますので,シェル・スクリプト内のコマンドもフルパスで書いた方がいいでしょう。

なお,環境変数は,setコマンドやenvコマンドで調べることができます。これらをcronで動作させて,ファイル出力することで,cronで動作させるときの環境変数を調べることができます。コマンドラインでは動作するがcronでは動作しないときなどには,調査してみてください。

監視システムの構築

さて,cronでコマンドを実行させる方法は解説したわけですが,コマンドを実行するだけでいい(mirrorのような)ものについては問題はないとしても,第6話で解説したような調査コマンドは,それを実行するだけでは意味がありません。調査内容をチェックして,問題があれば管理者に警告するための監視システムが必要になります。ここでは,そのシステムを構築するための方法について解説していきます。

複数のサーバ・マシンでこのシステムを運用するときは,下図のようになります。

監視システム概略

この図は3台構成で1台をバックアップサーバしている運用例です。基本的には何台構成でもシステムはそれほど変化しません。

このシステムを構成するためには,調査,収集,チェック,通知の4つの機能が必要になってきます。それについて解説します。

調査

コマンドを実行してサーバ状態を調査します。

具体的にはvmstatやdfなどの調査系コマンドを実行し,その結果を特定のファイルに出力します。シェル・スクリプトなどで簡単に実現できます。

収集

調査結果ファイルやログファイルを収集します。

各サーバ調査結果や,各種ログファイルを,調査用のサーバチェックプログラムが動作するサーバに集めます。mirrorなどでファイルをコピーすれば問題無く実現できます。

チェック

収集したファイルをチェックすることです。

収集したコマンド結果やログファイルを解析して,問題が無いかチェックします。具体的には,ファイルの中から必要な情報を取り出し,条件に照らし合わせていくことが必要です。また、過去のデータとの比較や、累積データのチェックも行うことになります。perlスクリプトを使用するのが簡単でいいでしょう。

通知

チェック結果を通知することです。

チェック時に問題があった場合,その内容を管理者に通知します。通知方法は基本的にはメールですが,電話をかけたりWebページにアップしたりすることも考えられます。

実行タイミングについて

これらの機能はcronによって実行されることになります。ここでは,その実行タイミングについての設定例を示します

30分ごと
リソース・チェックに使用するコマンドのうち,CPUやメモリのチェック関連のコマンドは,この頻度で実行することにします。時間によってサーバ負荷は大きく異なってくるので,負荷が高い時間のデータを得るためには,頻度を高くしなければなりません。これによって,一日のうち,どの時間にサーバ負荷が高いかの情報も得られますから,負荷の少ない時間に日次運用の作業を行うようにすればよいでしょう。
1日ごと
リソースチェックに使用するコマンドのうち,ハードディスク容量のチェックコマンドは,この頻度で実行することにします。ハードディスク容量は累積するので,あまり頻繁にチェックしてもそれほど意味はないからです。
また,ログを集めるためのプログラムや,コマンド結果をチェックして警告するためのプログラムも, この頻度で動かすことにします。
1ヶ月ごと
ログに対するgrepなどは,この頻度で実行することにします。ログに対する調査は,キーワードがどれくらい含まれているか,ということなので,ある程度の量で調査しないと,データがとりにくいからです。そのとき同時にログの切り替えも行うことにします。

なお,第5話で述べた通り,1時間ごと,1日ごとに,mirrorが動作してバックアップをとります。また,バックアップ確認用のプログラムも,cronで1週間に1度動作させることになるでしょう。バックアップは,人手を介さないとできない作業ですから,作業完了後,チェックジョブを実行してもらうべきでしょう。人の場合,休暇を取ることもありますし,祝日の場合も,時間がずれます。


次回予告

今回までで,定常運用編は一応終了とし,次回からは,随時運用編になります。ashにおける具体的な事例などは,後程まとめて紹介していく予定です。

と,いうわけで次回は「ユーザの追加,削除が必要なときは?」です。

(ASHマルチメディア研究会/joe,はしもと)