VBScriptを掌握する:netstatパースによる堅牢なポート監視アーキテクチャ
VBScript。現代のクラウドネイティブな開発者から見れば「遺物」かもしれない。だが、Windowsの心臓部で数ミリ秒のレイテンシを競い、APIの境界線を泳ぐ我々にとって、これほど軽量かつ強力な武器はない。
今日は、監視エージェントを導入できない閉鎖環境や、レガシーサーバーの死活監視において真価を発揮する「netstatパースによるポート監視」の極意を伝授する。ただ動くだけのスクリプトではない。メモリ管理とプロセス実行のオーバーヘッドを極限まで削ぎ落とした、アーキテクトのための実装論だ。
—
1. プロセス実行の「闇」を制御する
`WScript.Shell`の `Run` メソッドを安易に使うのは素人の所業だ。コマンドプロンプトがフラッシュするのを許容し、標準出力のキャプチャをファイル経由で行うなど、IO負荷の観点から論外である。
我々は `Exec` メソッドを用い、標準出力(`StdOut`)ストリームを直接パイプとして制御する。これにより、ディスクIOを回避し、メモリ上で完結したストリーム処理を実現する。
‘ メモリリークを許さないオブジェクト管理の基本
Option Explicit
Dim shell, execObj, stream, line, targetPort
targetPort = “8080” ‘ 監視対象ポート
Set shell = CreateObject(“WScript.Shell”)
‘ 1. プロセスを非同期実行し、標準出力ストリームをキャプチャ
‘ /an はアドレスとポートを数値で出力させるための必須オプション
Set execObj = shell.Exec(“netstat -an”)
Do While execObj.Status = 0
WScript.Sleep 100 ‘ CPU占有率を抑えるためのインターバル
Loop
‘ 2. ストリームの完全消費
Set stream = execObj.StdOut
Do While Not stream.AtEndOfStream
line = stream.ReadLine
‘ 特定ポートかつLISTEN状態を判定
If InStr(line, “:” & targetPort) > 0 And InStr(line, “LISTENING”) > 0 Then
WScript.Echo “Port ” & targetPort & ” is alive.”
Exit Do
End If
Loop
‘ 3. 明示的なオブジェクト解放(重要)
Set stream = Nothing
Set execObj = Nothing
Set shell = Nothing
—
2. パフォーマンスの深淵:文字列操作の罠
VBScriptの文字列操作は `BSTR` 型というポインタ経由で行われる。ループ内で巨大な文字列を連結したり、不要なオブジェクト生成を繰り返すと、ガベージコレクションが頻発し、システム全体のレスポンスを悪化させる。
- InStr関数を極める: 正規表現(`VBScript.RegExp`)は強力だが、コストが高い。単純なポート判定であれば `InStr` を用いるのが最速だ。
- オブジェクト生成の局所化: `Set` をループ内で行う愚を犯してはならない。メモリの断片化を避け、スコープを最小に保つことが、常駐監視スクリプトの命綱だ。
—
3. レガシー環境における「監視の哲学」
このスクリプトをタスクスケジューラに組み込む際、注意すべきは「ゾンビプロセスの抑制」だ。
もし監視間隔が短く、ポートの状態確認に時間がかかる場合、プロセスが重複してメモリを食いつぶす。これを防ぐには、スクリプト実行時に「自身が既に動作中か」を判定するロジック(WMIによるプロセス名検索など)を付与するのが、シニアエンジニアの嗜みである。
アーキテクトの助言:
1. WMIのコスト: `GetObject(“winmgmts:”)` は強力だが重い。極限のパフォーマンスを求めるなら、`netstat` の結果を一度フラットファイルに落とすのではなく、メモリ上の配列に格納し、後続の解析を高速化せよ。
2. 権限の壁: 管理者権限が必要なポート状態がある。スクリプト実行ユーザーの権限設定を怠れば、`netstat` は沈黙する。必ずマニフェスト、あるいは管理者権限での実行を前提とした運用設計を行うこと。
—
4. 結び:コードは呼吸している
VBScriptでのコーディングは、メモリ管理という名の「呼吸」を意識する作業だ。最新の言語が抽象化の裏で隠蔽しているハードウェアの挙動を、我々は肌で感じることができる。
このスクリプトは単なるポート監視ではない。システムが今、何を考え、どこに接続し、どのポートで沈黙しているのかを読み解くための「聴診器」だ。
さあ、このコードを現場に持ち帰り、枯れた技術の持つ圧倒的な信頼性を体感してほしい。トラブルが起きたとき、最後に頼りになるのは派手なフレームワークではなく、こうした極めて泥臭く、かつ堅牢なスクリプトなのだから。
