この特集のトップページへ
この回のトップページへ

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
OID 1.3.6.1.4.1.2021.2.1
サブツリー名 prEntry
用途 プロセスの情報一覧を含むテーブルを構成する階層ツリー。値はない
OID 1.3.6.1.4.1.2021.2.1.1.i
サブツリー名 prIndex
用途 このプロセス情報に割り当てられたインデックス番号。proc行の登場する順に,1,2,…と割り当てられる。iと同じ
OID 1.3.6.1.4.1.2021.2.1.2.i
サブツリー名 prNames
用途 proc行のプロセス名に指定したプロセス名
OID 1.3.6.1.4.1.2021.2.1.3.i
サブツリー名 prMin
用途 proc行の最小値に設定した値
OID 1.3.6.1.4.1.2021.2.1.4.i
サブツリー名 prMax
用途 proc行の最大値に設定した値
OID 1.3.6.1.4.1.2021.2.1.5.i
サブツリー名 prCount
用途 prNamesに指定されたプロセスが現在動いている数
OID 1.3.6.1.4.1.2021.2.1.100.i
サブツリー名 prErrorFlag
用途 エラーとなった場合1が設定される。エラーとなっていない場合0が設定される
OID 1.3.6.1.4.1.2021.2.1.101.i
サブツリー名 prErrMessage
用途 prErrorFlagが1になったとき,エラーメッセージが格納される
OID 1.3.6.1.4.1.2021.2.1.102.i
サブツリー名 prErrFix
用途 管理者がこのオブジェクトに1を設定すると,あらかじめsnmpd.confファイルのprocfix行で指定したコマンドが実行される
OID 1.3.6.1.4.1.2021.2.1.103.i
サブツリー名 prErrFixCmd
用途 prErrFixに1が設定されたときに実行されるコマンド名
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上で動作しているどのプロセスを監視したいのかによる。たとえば,デフォルトの設定をすべてコメントアウト(先頭に“#”を挿入する)し,sendmailhttpdnamedsyslogdの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コマンドを実行したときに,sendmailsyslogdは動いているけれどもhttpdnamedは動いていないという状況を示したものだ。この結果を見るとわかるように,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を書き込むことで,それらのプログラムを呼び出すことができるようになり,エラー状態からの復帰が可能となる。

 この仕組みは,きちんと設定して使うと便利なのだが,管理者以外に悪用されると,システムにセキュリティホールが生じるという話にもなるので,今回は割愛する。

PREV 20/36 NEXT