yum でアップデートした後に Nagios が起動できなくなる
SOFTWARE REPORT
Nagios の起動と停止で失敗する
Red Hat Enterprise Linux 4 でサーバー監視ツール Nagios 3.2.0 を利用していたのですけど、これを yum で Nagios 3.2.1-3.el4 にアップデートしてみたところ、Nagios の起動や停止に失敗してしまうようになりました。
以前のアップデートを行った際に記した EZ-NET レポート: 監視ツール Nagios を 3.2.0 にアップデートしてみる のときにも、設定ファイルで使用できなくなった設定項目があって起動できなくなったことがあって、Nagios はどうにも苦労がありそうです。
状況
状況としては、Nagios 再起動の際に、次のようなメッセージが表示されてしまいました。
service nagios restart
nagios を停止中: pidof: invalid options on command line!
pidof: invalid options on command line!
[失敗]
Nagios の再起動の際に、停止の時点で失敗しているようで、Nagios 自体は継続動作しているようでした。
試しに "ps axu | grep nagios" を実行して、kill -TERM コマンドにより Nagios を直接停止してみたところ、Nagios の再起動の際のメッセージが、上記とは異なるものになりました。
service nagios start
nagios が停止していますが PID ファイルが残っています
nagios を起動中: [ OK ]
これで、いっけん上手く動作するようになったようにも思えるのですが、再び Nagios を再起動してみると、最初と同じ状況になってしまうのでした。
service nagios restart
nagios を停止中: pidof: invalid options on command line!
pidof: invalid options on command line!
[失敗]
PID ファイルとサブシステム周りの検証
そこで、Nagios を kill で強制終了した上で、PID ファイルを手動で削除してみます。
こうして、Nagios の起動を再び試みてみたところ、次のメッセージが表示され、今度は Nagios の起動そのものが出来なくなってしまいました。
service nagios start
nagios は停止していますがサブシテムがロックされています
nagios を起動中: [失敗]
ここで通知された "サブシステムがロックされている" というのは、アプリケーションの二重起動を防止するための仕組みのようで、Nagios の場合は、起動時に "/var/lock/subsys/nagios" というファイルを作成することで、既に Nagios が起動していることを知らせることが出来るようになっているようです。
一般に、何らかの理由によりこのファイルが残ってしまう場合もあるようで、その場合はこのファイルを削除することにより対応するとのことだったので、今回もこの "/var/lock/subsys/nagios" を削除してみることにしました。
こうしてロックファイルを削除した後、Nagios の起動を試みたところ、ひとまずは起動できていそうな感じになりました。
service nagios start
nagios を起動中: [ OK ]
ただ、これでも相変わらず、Nagios の停止には失敗してしまい、その後はまた同様の症状になってしまうのでした。
起動スクリプトの互換性
Nagios の停止に失敗する理由について調べて行くと、どうやら Red Hat 4 系と Red Hat 5 系との互換性が影響している様子でした。
OS 5 では killproc コマンドに -p オプションとして PID ファイルを指定することが出来るようになっている感じなのですけど、OS 4 では killproc に -p オプションを指定することはできません。
今回の利用環境は Red Hat Enterprise Linux 4 だったのですけど、どうやら今回の Nagios アップデートで、起動スクリプトが OS 5 用のものに置き換わってしまったような感じです。
この環境は、自分で運用するようになって初めての Nagios 更新だったので、以前にこの環境を扱っていた人が起動スクリプトを調整していたのかどうかはわかりませんが、ともあれ起動スクリプトを OS 4 に対応させる必要が出てきたことは確かです。
"/etc/rc.d/init.d/nagios" を参照してみると、stop と restart 用の記述の中に "killproc" が実行されるラインがありましたので、そこから "-p ${pidfile}" の記載だけを取り除くことで、Nagios の停止が正しく行えるようになりました。
PID ファイルの保存場所を変更する
ただ、相変わらず Nagios の起動には失敗してしまいます。
調べて行くと、どうやら今度は、Nagios が起動した際に作成されるはずの PID ファイルが正しく生成されていないような感じでした。
これを自分で作成してあげると Nagios が起動できるのですが、いつもいつも手動で作成してあげる訳にも行きません。
PID ファイルが作成されない原因について調べてみたところ、Nagios で設定されている PID ファイル (lock_file = "/var/run/nagios.pid") と、起動スクリプトで指定されている PID ファイル (pidfile = "/var/nagios/nagios.pid") との間に、矛盾があることがわかりました。
どうやら Nagios のアップデートによって、どちらかの設定値が変更されてしまった様子です。
今回は Nagios 設定の方を調整してみることにしました。
"/etc/nagios/nagios.cfg" ファイルを編集して、lock_file の値を次のように変更します。
こうしたところ、ようやくながら、Nagios が起動や終了を正しく行えるようになりました。