この記事 (http://ooltcloud.sakura.ne.jp/blog/201801/article_06231953.html) の続きです。
以下はこの記事で作成したリポジトリの登録を前提としています。
プロセス監視の設定にあたって 2 つ重要な点があります。
- プロセスの設定は正規表現で記述するのですが、これがマッチしないことがある。
たとえばメモ帳の起動(notepad.exe)を確認したい場合、"notepad" ではなく ".*notepad.*" のように書く必要があります。
したがってどのようなコマンドラインが渡り、それをマッチする正規表現は何かを事前にテストしたうえで入力したほうが確実です。(詳細は 「プロセス監視の対象となるコマンドライン引数について」 へ) - プロセスを起動/停止してもそれを SNMP で検知するまでにかなりの時間がかかる。
Windows の場合、手持ちの環境で実測したところ MIB の更新が 2 分周期のようでした。
したがって Hinemos で 1 分周期の設定にしていても、最遅の場合 3分 (=2分 + 1分) しないと Himemos には伝わらないことになります。加えて、同じ重要度の監視結果が複数回発生しないと通知しないことにしていると(=“監視設定[通知]” の設定) さらにその分遅れます。
なのでテストをする場合は、実際のプロセスの起動/停止からかなりの遅延が発生することを意識して行う必要があります。
特にこの 2 つがあわさると、確認に時間ばかりかかりいつまでたっても意図した結果が得られないというループに入ることがあるので要注意です(汗
以下は監視対象ノード (Windows) で hosts ファイルを開いたメモ帳が起動しているかどうかを確認する場合の設定手順です。
- 手順
- Hinemos リポジトリの監視対象ノードの SNMP 設定を確認します。
リポジトリパースペクティブの “リポジトリ[ノード]” ウインドウで監視対象ノードをクリックし SNMP の設定を確認します。
コミュニティ名やバージョンが意図したとおりであれば OK です。 - 監視対象ノードの SNMP サービスの起動を確認します。
プロセス監視は Hinemos エージェントのインストールは不要ですが SNMP を介して情報を取得するので、SNMP サービスが起動している必要があります。
- コミュニティ名を確認します。
コミュニティ名が意図したものであることも忘れずに確認しておきます。
- 監視設定を作成します。
監視設定パースペクティブの “監視設定[一覧]” ウインドウで「作成」を選択します。
- プロセス監視を選択します。
- プロセス監視の内容を設定します。
コマンドに以下を設定します。
^(|.*\\)notepad\.exe$
引数に以下を設定します。
^( |.*\\)*hosts *$
「大文字・小文字を区別しない」にチェックを入れます。
また、以下の項目も画面の通りに設定します。
- 監視項目 ID
- スコープ
- 間隔
- 監視
- 通知ID
- アプリケーション
- 監視の確認をします。
最初はメモ帳を起動していないので「危険」が記録されます。
- メモ帳を起動します。
名前を指定して実行で「notepad c:\windows\system32\drivers\etc\hosts」と入力するなどして、host ファイルを表示させます。
3~5 分程度の後「情報」と記録されることを確認します。
- Hinemos リポジトリの監視対象ノードの SNMP 設定を確認します。
- プロセス監視の対象となるコマンドライン引数について
上記手順で「コマンド」と「引数」を設定しました。
ところがこの比較元になる SNMP から取得される文字列は想像と違うかもしれません。なぜなら同じ「メモ帳が hosts を開いている」でも起動のされかたによって渡されている文字列が違うからです。
以下ではコマンドプロンプトで起動した例とタスクスケジューラーで起動した例を比較しています。- コマンドプロンプトでメモ帳を起動します。
cd C:\windows\system32 後に notepad C:\windows\system32\drivers\etc\hosts を実行します。
- タスクスケジューラーでメモ帳を起動します。
タスクスケジューラーに以下のような登録をし、登録終了後手動で実行します。
- タスクマネージャーで状態を確認します。
コマンドライン列(表示されていないようであればタイトル行を右クリックして列の追加を使って追加してください)を確認すると表示が異なっていることが確認できます。
- snmpwalk で確認します。
Bash on Ubuntu on Windows または Hinemos manager などから snmpwalk を実行します。
(snmpwalk の設定方法はここを参照してください。)
参照する OID は .1.3.6.1.2.1.25.4.2.1.2 (プロセス名) です。notepad.exe が 2 つ表示されることを確認します。
以下の例だと OID 末尾の .8380 や .11172 が PID です。上記タスクマネージャーの表示と合致しているかも確認しておきます。[root@localhost ~]# snmpwalk -c public -v 2c 192.168.0.1 .1.3.6.1.2.1.25.4.2.1.2 | grep "notepad" HOST-RESOURCES-MIB::hrSWRunName.8380 = STRING: "notepad.exe" HOST-RESOURCES-MIB::hrSWRunName.11172 = STRING: "notepad.exe"
- コマンドプロンプト実行の場合
コマンドプロンプトで起動したほうの Path 名と引数を確認します。
Path 名の OID は .1.3.6.1.2.1.25.4.2.1.4.PID, 引数の OID は .1.3.6.1.2.1.25.4.2.1.5.PID です。コマンドプロンプトで起動した場合は Path 名が null になっている (カレントディレクトリから起動したから) ことと、引数の先頭にスペースが挿入されていることを確認します。
[root@localhost ~]# snmpwalk -c public -v 2c 192.168.0.1 .1.3.6.1.2.1.25.4.2.1.4.8380 HOST-RESOURCES-MIB::hrSWRunPath.8380 = "" [root@localhost ~]# snmpwalk -c public -v 2c 192.168.0.1 .1.3.6.1.2.1.25.4.2.1.5.8380 HOST-RESOURCES-MIB::hrSWRunParameters.8380 = STRING: " C:\\windows\\system32\\drivers\\etc\\hosts"
- タスクスケジューラーでの実行の場合
タスクスケジューラーでの実行の場合 Path 名が full path になっていることと、引数の先頭にスペースが挿入されて「いない」ことを確認します。
タスクマネージャーの表示ではスペースがあるように見えますが、snmpwalk で取得した文字列には「スペースはない」点にも注意です。(=タスクマネージャーの表示に全幅の信頼がおけるわけではないということ)[root@localhost ~]# snmpwalk -c public -v 2c 192.168.0.1 .1.3.6.1.2.1.25.4.2.1.4.11172 HOST-RESOURCES-MIB::hrSWRunPath.11172 = STRING: "c:\\windows\\system32\\" [root@localhost ~]# snmpwalk -c public -v 2c 192.168.0.1 .1.3.6.1.2.1.25.4.2.1.5.11172 HOST-RESOURCES-MIB::hrSWRunParameters.11172 = STRING: "C:\\windows\\system32\\drivers\\etc\\hosts"
- コマンドライン文字列には「ゆれ」がある。
従って、プロセス監視のコマンドラインと引数は上記のような「ゆれ」が発生することを念頭に置いて設定する必要があります。
また、正規表現と言いながら部分一致の正規表現 (例えば "notepad" と指定すること) ではマッチしません。なのでコマンドおよび引数の文字列全体に対してマッチする正規表現を作る必要があります。
このようなことから、想定されるコマンドライン文字列に対して設定する正規表現文字列がマッチするかを事前に検証しておいたほうが賢明です。
たとえば上記の例の場合、Windows 環境であれば Powershell を使用して確認することができます。" c:\windows\system32\drivers\etc\hosts" -match "^(|.*\\)*hosts *$"
ただ powershell での確認は OK でも Hinemos java の正規表現を使っているのでうまくマッチしない場合があるかもしれません。その場合は java を使って確認する必要がありますが jre ではなく jdk のインストールが必要など敷居が高いです。
java で確認する場合は、例えば以下のように行います。- 確認用プログラム (regcheck.java) を作成します。
public class regcheck { public static void main(String[] args) { System.out.printf("target : %s\n", args[0]); System.out.printf("pattern: %s\n", args[1]); java.util.regex.Pattern p = java.util.regex.Pattern.compile(args[1]); java.util.regex.Matcher m = p.matcher(args[0]); System.out.println(m.matches()); } }
- コンパイルします。(javac は jdk のインストールフォルダの bin の中にあります)
C>javac C:\Users\user01\Desktop\regcheck.java
- 実行します。
C>java -cp C:\Users\user01\Desktop regcheck " c:\\windows\\system32\\drivers\\etc\\hosts" "^(|.*\\)*hosts *$" target : c:\\windows\\system32\\drivers\\etc\\hosts pattern: ^(|.*\\)*hosts *$ true
- 確認用プログラム (regcheck.java) を作成します。
- その他注意点
どうも日本語 (ASCII 文字以外) のコマンドおよび引数はうまく認識しない感じがします。
具体的には Windows の SNMP は Shift JIS のバイトストリームを戻しているのに対し Hinemos は UTF-8 でデコードしている感じです。
設定で変わるのかもしれませんが、その設定どこにあるかは分かっていません。
SNMP 監視もプロセス監視も文字コードの設定はなく、SNMP TRAP 監視だけが文字コードの設定を持っているので問答無用で UTF-8 デコードなのかもしれませんが。(それだと困りますが、さりとてソースを読む気はないのです・・・)
- コマンドプロンプトでメモ帳を起動します。