●proc行 |
procの設定では,どのプロセスをSNMPから監視したいのかを指定する。proc行の設定書式は次のようになっている。
procプロセス名最大数 最小数 |
プロセス名には,SNMPから監視したいプロセス名を,ps -eコマンドの出力で得られる形で指定する。そして,最大数の部分には,「このプロセスが最大いくつ存在する場合にエラーとして記録するのか」,最小数の部分には,「このプロセスが最低いくつ存在しない場合にエラーとして記録するのか」をそれぞれ指定する。最大数を省略した場合には無限大,最小数を省略した場合には1を指定したものとみなされる。
デフォルトのsnmpd.confファイルには,次のようなproc行がある。
procmountd procntalkd 4 procsendmail 10 1 |
この意味は次の通りである。
- moutdプロセスが1つも存在しない場合にはエラーとして記録
- ntalkdプロセスが4つ以上存在する場合にはエラーとして記録
- sendmailプロセスが1つも存在しない場合,もしくは,10個以上存在する場合にはエラーとして記録
記録情報は,prTableサブツリー(1.3.6.1.4.1.2021.2)内に含まれる。proc行で指定した情報は,snmpd.confファイルに登場する順番で,先頭から1,2,3,…というインデックス番号が振られる。この例でいえば,mountdが1,ntalkdが2,sendmailが3にそれぞれ対応する。そしてprTableサブツリーには,配列のような形で各データが保存される(Table 10)。
Table 10 prTableサブツリー(1.3.6.1.4.1.2021.2)
|
※iはインデックス番号。snmpd.confファイル中に出てきたproc行の登場順に,先頭から1,2,3,…という値。
snmpd.confファイルのproc行の設定で指定した条件がエラーとなった場合,1.3.6.1.4.1.2021.2.1.100.iの値が1となり,そのエラーメッセージが1.3.6.1.4.1.2021.2.1.101.iに格納される(iはインデックス番号)。デフォルトのsnmpd.confファイルの設定であれば,次のような動作をすることになる。
- mountdプロセスが1つも存在しない場合
1.3.6.1.4.2021.2.1.100.1の値が1。1.3.6.1.4.2021.2.1.101.1の値がそのエラーメッセージ。 - ntalkdプロセスが4つ以上存在する場合
1.3.6.1.4.2021.2.1.100.2の値が1,1.3.6.1.4.2021.2.1.101.2の値がそのエラーメッセージ。 - sendmailプロセスが1つも存在しないか10個以上存在する場合
1.3.6.1.4.2021.2.1.100.3の値が1,1.3.6.1.4.2021.2.1.101.3の値がそのエラーメッセージ。
このようにproc行を指定するとプロセスの状態が監視できるので,SNMPを通じて,特定のプロセスが何らかのトラブルにより消滅してしまったり,処理の増加により予想以上に増えてしまったりしたときの情報を取得できるというわけだ。
proc行をどのように設定すればよいのかは,Linux上で動作しているどのプロセスを監視したいのかによる。たとえば,デフォルトの設定をすべてコメントアウト(先頭に“#”を挿入する)し,sendmail,httpd,named,syslogdの4つのプロセスを管理するには,次のようにproc行を設定すればよい
proc sendmail 10 1 proc httpd 20 1 proc named proc syslogd |
snmpd.confファイルを変更した場合,それを反映させるためには,snmpdに対してkill -HUPを実行しなければならない。kill -HUPを実行するには,次のようにする。
$ ps -ax | grep snmpd<--- プロセス番号を調べる 30711 ?S0:14 [snmpd] <--- プロセス番号は30711 $ su <--- rootユーザーとしてログインする Password:rootユーザーのパスワードを入力する # kill -HUP 30711 <--- psコマンドで参照したプロセス番号に対してkill -HUPを実行する # exit <--- 一般ユーザーに戻る |
snmpd.confファイルをこのように変更した場合,prTableサブツリー(1.3.6.1.4.2021.2.1)以下をsnmpwalkコマンドで取得すると,次のようになる。
$ snmpwalk localhost private .1.3.6.1.4.1.2021.2.1 enterprises.ucdavis.prTable.prEntry.prIndex.1 = 1 enterprises.ucdavis.prTable.prEntry.prIndex.2 = 2 enterprises.ucdavis.prTable.prEntry.prIndex.3 = 3 enterprises.ucdavis.prTable.prEntry.prIndex.4 = 4 enterprises.ucdavis.prTable.prEntry.prNames.1 = sendmail enterprises.ucdavis.prTable.prEntry.prNames.2 = httpd enterprises.ucdavis.prTable.prEntry.prNames.3 = named enterprises.ucdavis.prTable.prEntry.prNames.4 = syslogd enterprises.ucdavis.prTable.prEntry.prMin.1 = 1 enterprises.ucdavis.prTable.prEntry.prMin.2 = 1 enterprises.ucdavis.prTable.prEntry.prMin.3 = 0 enterprises.ucdavis.prTable.prEntry.prMin.4 = 0 enterprises.ucdavis.prTable.prEntry.prMax.1 = 10 enterprises.ucdavis.prTable.prEntry.prMax.2 = 20 enterprises.ucdavis.prTable.prEntry.prMax.3 = 0 enterprises.ucdavis.prTable.prEntry.prMax.4 = 0 enterprises.ucdavis.prTable.prEntry.prCount.1 = 1 enterprises.ucdavis.prTable.prEntry.prCount.2 = 0 enterprises.ucdavis.prTable.prEntry.prCount.3 = 0 enterprises.ucdavis.prTable.prEntry.prCount.4 = 1 enterprises.ucdavis.prTable.prEntry.prErrorFlag.1 = 0 enterprises.ucdavis.prTable.prEntry.prErrorFlag.2 = 1 enterprises.ucdavis.prTable.prEntry.prErrorFlag.3 = 1 enterprises.ucdavis.prTable.prEntry.prErrorFlag.4 = 0 enterprises.ucdavis.prTable.prEntry.prErrMessage.1 = enterprises.ucdavis.prTable.prEntry.prErrMessage.2 = Too few httpd running (# = 0) enterprises.ucdavis.prTable.prEntry.prErrMessage.3 = No named process running. enterprises.ucdavis.prTable.prEntry.prErrMessage.4 = enterprises.ucdavis.prTable.prEntry.prErrFix.1 = 0 enterprises.ucdavis.prTable.prEntry.prErrFix.2 = 0 enterprises.ucdavis.prTable.prEntry.prErrFix.3 = 0 enterprises.ucdavis.prTable.prEntry.prErrFix.4 = 0 enterprises.ucdavis.prTable.prEntry.prErrFixCmd.1 = enterprises.ucdavis.prTable.prEntry.prErrFixCmd.2 = enterprises.ucdavis.prTable.prEntry.prErrFixCmd.3 = enterprises.ucdavis.prTable.prEntry.prErrFixCmd.4 = |
上の結果は,snmpwalkコマンドを実行したときに,sendmailとsyslogdは動いているけれどもhttpdとnamedは動いていないという状況を示したものだ。この結果を見るとわかるように,httpdに相当する2番目の項目とnamedに相当する3番目の項目に相当する,“1.3.6.1.4.1.2021.2.1.100.2”と“1.3.6.1.4.1.2021.2.1.100.3”は1となり,“1.3.6.1.4.1.2021.2.1.101.2”と“1.3.6.1.4.1.2021.2.1.101.3”にはエラーメッセージが格納されていることが確認できる。
なおsnmpdでは,snmpd.confファイルにprocfix行をあらかじめ設定しておくと,管理者がprErrFixオブジェクト(1.3.6.1.4.1.2021.2.1.102.i)に1を書き込んだときに(値を書き込むにはsnmpsetというコマンドが使える),procfix行で定義しておいたプログラムを実行することができるようになっている。
たとえば,httpdを再起動したり,sendmailを再起動したりするといったプロセスを起動するようなプログラムを用意し,それをprocfix行で指定しておけば,管理者が異常を発見したときにSNMPマネージャを使ってprErrFixオブジェクト(1.3.6.1.4.1.2021.2.1.102.i)に1を書き込むことで,それらのプログラムを呼び出すことができるようになり,エラー状態からの復帰が可能となる。
この仕組みは,きちんと設定して使うと便利なのだが,管理者以外に悪用されると,システムにセキュリティホールが生じるという話にもなるので,今回は割愛する。
20/36 |