いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.158 / 読者数:1313名

こんばんは、うすだです。

来週、クリエーターズ・マーケットという催しに、 個人で出展することになっているのですが、見事なくらい準備ができていません。

現在、クリマの準備、シス管の発行、そして負荷が一向に下がらない本業と、 これら3つが頭の中を駆け巡り、混乱しております。
(にしても、本業が最初に挙がらないのは、どーしてなんでしょうね…。)

幸いにも、クリマは、いとこと息子が当日手伝ってくれるので、 モノさえ揃っていればなんとかなる、という点でやや安心感があります。
(モノが揃わない(ネタがない)という問題は、依然としてあります。)

しかし、あとの2つに関しては、誰かに頼むわけにもいきません。
もうがんばるしかないですね、とか言いながら、 こんなときに限って逃避行動が活発になったりするので、注意が必要です。

そんな中、なんとかネタを絞り出して書き上げ、メルマガを発行しようとする自分を、 少しは褒めてあげたいと思います。

…はい、心の余裕がありませんが、はりきってるつもりでがんばります。

今回のお題 - monit でプロセスを監視する

当り前のことを言ってしまいますと、サーバというのは、 みんなが必要とするサービスを提供するためにあります。
24時間年中無休で、1秒たりとも休まず奉仕してこそのサーバですよね。

しかし、思わぬ事態やミスなどによって、 サービスの要であるデーモンが異常終了してしまう、といったことが、 起こらないとも限りません。

そんなとき、いち早く気づいて対処するのが、システム管理者の使命だと思いますが、 いつなんどきも即座に対応! とはいかないこともあります。

とはいえ、不測の事態によってユーザ様に迷惑をかけていては、 システム管理者の名が廃ります。
己がいなくとも、デーモンが動作していないときに、 起動してくれるよう仕込んでおくと、サーバの奉仕が滞らなくてよさそうです。

というわけで今回は、monit というユーティリティを使って、デーモンを監視し、 止まっていたら再起動するようにしてみたいと思います。


Monit とは、プロセスを監視して、 なにか問題があったときに再起動などを行ってくれる、便利なユーティリティです。

Monit
http://mmonit.com/monit/

ありがたいことに、Debian 系や Fedora などには、すでにパッケージが存在します。 ですので、実践を常に心がけている貴兄は、例によって例のごとく、 yum や apt を使ってインストールしてください。

  # yum install monit      (RedHat 系の場合)
  # apt-get install monit  (Debian 系の場合)

しかし、私が普段お世話になっている Vine や CentOS には、 パッケージがなさそうです。
ですが、幸い、ソースコードに SPEC ファイルがありますので、 問題なくパッケージにすることができます。
(手順は、いつもとほぼ同様ですので、割愛します。)

ちなみに、前回の、inotify で /etc の監視を仕込んだ状態のままにしていますと、 パッケージをインストールしたときや、以降で設定を行うときなどのたびに、 メールがばんばん飛んできます。ご注意ください。
(わたしの場合、監視していることをを忘れていて、びっくりしました。)


さて、monit のインストールが済みましたら、設定を行いましょう。

とはいえ、設定ファイルのパスが、 ディストリビューションなどによって微妙に異なります。

Debian系: /etc/monit/monitrc
Fedora:   /etc/monit.conf
その他:   /etc/monitrc

とりあえず、以降では、 設定ファイルのパスが /etc/monitrc という前提で話を進めます。 ご使用のパッケージに置き換えて読み進めてください。

それから、今回監視するデーモンは、安直ですが apache2 にします。
ディストリビューションによっては httpd だったりしますが、 こちらもご使用の環境にあわせて置き換えて読んでくださいませ。


それでは、今度こそ、設定を行いたいと思います。
まずは、必要最小限かつ共通の設定を、一気にご紹介していきます。

最初は、set daemon で、監視する間隔を秒数で指定します。

  set daemon <秒数>

指定した秒数毎に、monit がプロセスをチェックしてくれます。
許容されるサービスの停止時間と、サーバへの負荷を考慮して、 えいやーで決めてください。

そして、set logfile で、ログのパスを指定します。

  set logfile <パス>

指定したパスに、ログが出力されます。
あるいは、以下のように syslog を指定しますと、syslog 経由でログを出力します。

  set logfile syslog facility <facility名>

facility名には、log_daemon か log_local0〜7 が指定できます。
Monit のログを分ける必要がなければ、log_daemon を指定しましょう。

次に、set mailserver でメールサーバを指定します。

  set mailserver <サーバ名>

ポート番号が SMTP の 25番ではない場合は、 以下のようにポート番号を指定してください。

  set mailserver <サーバ名> port <ポート番号>

カンマで区切って、上記を複数指定することも可能です。

  set mailserver smtpserver1, smtpserver2 port 587, localhost

それから、set alert で、通知するメールアドレスを指定します。

  set alert <メールアドレス>

すると、なにかイベントが発生するたびに、 指定したアドレスへメールが送られます。
なんでもかんでも通知されるとメールだらけになっちゃうよ、という貴兄は、 特定のイベントだけ通知してもらうよう、以下のように

  set alert <メールアドレス> on { <イベント名(の羅列)> }

通知してほしいイベント名を明記します。
あるいは、特定のイベントだけ通知されないよう、以下のように

  set alert <メールアドレス> not { <イベント名(の羅列)> }

通知してほしくないイベント名を明記します。

そして最後に、include で、別の設定ファイルを読み込みます。

  include <パス>

たとえば、Fedora の場合ですと、設定ファイルの最後に、

  include /etc/monit.d/*

と書かれていますので、 /etc/monit.d/ 以下の設定ファイルを読み込んでくれます。
/etc/monit.d/ 以下すべてのファイルを対象とするのではなく、たとえば

  include /etc/monit.d/*.conf

と、*.conf というファイルだけを対象にしてもよいと思います。
(設定ファイルを分ける必要がなければ、書かなくてもよいと思います。)

 

以上が、最低限的な設定です。
ご参考までに、例を以下に示します。

  set daemon 60
  set logfile syslog facility log_daemon
  set mailserver localhost
  set alert usu@usupi.org not { instance }
  include /etc/monit.d/*

4行目で、instance というイベントの通知を行わないようにしていますが、 これにより、monit 自身の起動や停止が、メールで通知されなくなります。


さて、基本的な設定はできました。
…が、肝心のプロセスの監視の設定がまだですよね。

プロセスの監視に関する設定は、check process で記述します。
ただ、さまざまな記述ができますので、ここでは、 HTTP で指定したパスにアクセスできることをチェックし、 失敗したら再起動するための設定を以下に示します。

  check process <プロセス名> with pidfile <PIDファイル名>
    start program = "<プロセスの起動方法>"
    stop program = "<プロセスの停止方法>"
    if failed host <ホスト名> port <ポート番号>
      protocol HTTP request <URLのパス> then restart
    group <プロセスのグループ>

プロセス名は、単なる名前ですので、お好きな名前をご指定ください。
PIDファイル名は、プロセスID が記述されているファイルです。
/etc/init.d/apache2 の中を拝見しますと、 /var/run/apache2.pid などと明記されていると思います。 (/var/run/ 以下を見てもわかりますね。)
プロセスの起動および停止方法は、/etc/init.d/apache2 start や stop ですよね。
ホスト名とポート番号は、通常ですと localhost と 80 だと思います。
URLのパスは、単純に /index.html としてもいいですが、 ログに残らないパスがあれば、そちらを指定したほうがよいと思います。
プロセスのグループは、httpd.conf の Group で指定しているグループ名です。

以上をふまえた例を、以下に示します。

  check process apache with pidfile /var/run/apache2.pid
    start program = "/etc/init.d/apache2 start"
    stop program = "/etc/init.d/apache2 stop"
    if failed host localhost port 80
      protocol HTTP request /keepalive.txt then restart
    group apache

これを、/etc/monitrc に追加するか、/etc/monit.d/apache2 などに記述してください。


以上で、設定は一通り揃いました。
それでは、monit を起動してみましょう。

  # /etc/init.d/monit start

特に問題なければ、syslog などに以下が出力されていると思います。

  monit[PID]: Starting monit daemon
  monit[PID]: 'ホスト名' Monit started

では、apache2 を止めてみます。

  # /etc/init.d/apache2 stop

そして、set daemon で指定した秒数以上待ちます。
設定が間違っていなければ、以下のように、apache2 の停止に気づいて、 再起動した旨のメッセージが、syslog などに出力されるはずです。

  monit[PID]: 'apache' process is not running
  monit[PID]: 'apache' trying to restart
  monit[PID]: 'apache' start: /etc/init.d/apache2
  apache2: apache2起動 succeeded
  monit[PID]: 'apache' process is running with pid PID

残念ながらそうでなかった貴兄は、出力されるメッセージを頼りに、 誤りを見つけ出してくださいませ。

あ、そして、これで問題がなければ、OS 起動時に monit が自動的に起動されるよう、 checkconfig や update-rc.d コマンドで設定してください…と言いたいところですが、 もともと有効になっているようでした…。
(逆に、monit を試した後、必要なければ、 明示的に無効にしておいた方がよいように思います。)


以上、monit を使ってプロセスを監視する方法を、ご紹介しました。

WWWサーバ(apache2)に限らず、いろんなデーモンなどを監視できます。
このデーモンが終了するとまずいな…と思われるものがあれば、 monit を使って、ぜひ監視してみてください。

…ところで、実は、だいぶ過去に、wgetコマンドを使って自力で監視していることに、 いまごろ気づきました。

Vol.069 - WWW サーバを監視する
http://www.usupi.org/sysad/069.html

まあしかし、他のサービスも含めて一括管理したい場合などを考慮しますと、 monit を使った方がよいと思います。(当時は知りませんでしたね…)

宿題の答え

前回の宿題は、

  実体のないファイルシステムなどを inotifywait で監視するとどうなるか、
  試してみましょう。

でした。

まずは、procfs を試してみたいと思います。
適当なプロセスを起動し、/proc/PID を inotifywait で監視します。
ここでは、なにかと扱いやすい sleep コマンドを実行してみました。
(下記では30秒眠ってから終了します。お好みの時間をご指定ください。)

  $ sleep 30 &
  [1] 6356

そして、sleep コマンドが終了する前に、すかさず inotifywait を実行します。 (プロセスID が 6356 なので、/proc/6356 を監視しています。)

  $ inotifywait -mr /proc/6356
  Setting up watches.
  Watches established.

そして、30秒待ちます。
… sleep コマンドは終了しているはずですが、なにも起こりません。
別の端末から /proc/PID の存在を確認してみますと、

  $ ls /proc/6356
  /bin/ls: /proc/6356: そのようなファイルやディレクトリはありません

すでに存在していないようです。
どうやら、procfs を inotify で監視するのは、無理があるようです。

 

次に、usbfs を試してみましょう。
通常は /proc/bus/usb にマウントされていますので、 /proc/bus/usb を監視してみます。

  $ inotifywait -mr /proc/bus/usb
  Setting up watches.  Beware: since -r was given, this may take \
  a while!
  Watches established.

そして、なにか USBデバイスを挿入してみましょう。
…無反応です。ですが、USBデバイスを抜去しますと、

  /proc/bus/usb/002/ DELETE 004

イベントが発生してくれました。
すっきりしませんが、usbfs にも、あまり期待をしないほうがよさそうです。

 

では、sysfs はどうでしょうか。

  $ inotifywait -mr /sys/bus/usb/devices
  Setting up watches.  Beware: since -r was given, this may take \
  a while!
  Watches established.

同様に USBデバイスを抜き差ししてみますが…無反応です。
root 権限でも同様でした。(sysfs、おまえもか!)

そのほか、いくつかのファイルシステムで同様に試してみましたが、 特殊なファイルシステムではうまく動作しないような印象を受けました。
(各自ご確認くださいませ。)

このあたり、本来であれば、 カーネルのソースコードを追いかけていけばわかりそうなのですが、 余力がなくて断念しました。(すみません…)
気になるところではありますので、機会があれば、 ソースコードを読んでみようと思います。

今回の宿題

今回の宿題は、

  メールでの通知が一切行われないよう monit を設定してみましょう。

です。

ご使用のサーバによっては、プロセスの監視とログの記録さえ行われればよかったり、 そもそもメールの送受信ができない環境であったり、ということがあるかもしれません。

monit のオンラインマニュアルを調べたり、Google 様に伺うなどして、 メールによる通知が行われない設定を試みてみてくださいませ。

あとがき

わたくし、現在はプログラマが本業で、システム管理に関しては、 あまりかかわりはありません。(ゲートウェイマシンの管理者ではあります。)

それでも、Linux 用のドライバを作ったり、 カーネルをいじくったりするお仕事をしていますので、それらに関連して、 システムをいじくる機会が少なからずあります。

最近も、/etc/inittab を書き換えたり、udev の設定を追加したりなど、 知らないと困りそうな小ネタ的作業が、いくつか発生しました。

そんなとき、シス管やっててよかったなぁと、ひそかに感じます。
ただ、設定手順や実行方法がとっさにわからないので、 バックナンバーを自分で読むことになるのですけれど。
それでも、なにもない状態よりは、100倍楽だと思います。

ですので、システム管理者ではないけれど Linux を使っているひとや、 これから使おうとしているひと、使わざるをえない状況に陥ってしまったひとなどにも、 おすすめのメルマガではないかと思います。

もし、お近くに、そういったかたがいらっしゃいましたら、 購読を強引にすすめてみてはいかがでしょうか。

 

…ええっと、すみません、結局ただの宣伝でしたね。
でも、やっててよかったと思うのは、本当です。
というわけで、今後も、末永くごひいきいただけますと幸いです。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、クリマで力を使いきった後の 6月21日(日) にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−クリマまであと6日しかないー (TεT;;;;
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本