【テクニカル・上級編】【ネットワークポート接続監視】WScript.Shell と netstat コマンド結果のパースによる特定通信ポートの常時監視 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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でのコーディングは、メモリ管理という名の「呼吸」を意識する作業だ。最新の言語が抽象化の裏で隠蔽しているハードウェアの挙動を、我々は肌で感じることができる。

このスクリプトは単なるポート監視ではない。システムが今、何を考え、どこに接続し、どのポートで沈黙しているのかを読み解くための「聴診器」だ。

さあ、このコードを現場に持ち帰り、枯れた技術の持つ圧倒的な信頼性を体感してほしい。トラブルが起きたとき、最後に頼りになるのは派手なフレームワークではなく、こうした極めて泥臭く、かつ堅牢なスクリプトなのだから。

タイトルとURLをコピーしました