共有フォルダの「死」を看取る:VBScriptによる堅牢なネットワーク監視アーキテクチャ
ネットワーク・ストレージが「一瞬だけ」沈黙する。この事象は、モダンな高可用性インフラでも避けられないレガシーの呪いだ。特にSMB接続を多用する業務環境において、サーバーの瞬断はアプリケーションのフリーズを引き起こし、そのままメモリリークやプロセスハングアップへと直結する。
多くのエンジニアは、この問題を「アプリケーション層でのエラーハンドリング」で解決しようとするが、それは対症療法に過ぎない。我々アーキテクトがやるべきは、OSレベルでの接続状態をVBScriptで抽象化し、監視プロセスを独立した番人として常駐させることだ。
今回は、FileSystemObject(以下FSO)の脆さを逆手に取り、如何にして「死なないスクリプト」を構築するか、その極限の知見を共有する。
—
1. FSOの「偽りの安定」を見抜く
FSOは便利だが、ネットワークパスに対しては極めて無力だ。`FolderExists`メソッドは、キャッシュされた情報を返すことがあるため、真の接続状態を反映しない。
真の堅牢性を得るためには、FSOを「存在確認」だけに使うのではなく、「I/O操作の成否」をエラーハンドリング(On Error Resume Next)のトリガーとして活用する必要がある。VBScriptの実行エンジン(wscript.exe)のメモリ空間を汚染しないよう、オブジェクトの生成と破棄のライフサイクルを徹底的に管理せよ。
2. 堅牢なネットワーク監視の実装コード
以下のコードは、指定されたパスへの接続が絶たれた際、即座に検知し、安全に再接続試行を行うモジュールの骨子である。
‘ Option Explicitは絶対の掟。暗黙の変数宣言はバグの温床である。
Option Explicit
Const TARGET_PATH = “\\Server\SharedFolder”
Const RETRY_INTERVAL = 5000 ‘ 5秒間隔
Const MAX_RETRIES = 10
Sub MonitorSharedFolder()
Dim fso, folder
Set fso = CreateObject(“Scripting.FileSystemObject”)
Do
On Error Resume Next ‘ 接続エラーを意図的にトラップする
‘ 接続確認の本体:FSOではなく、I/O操作を伴うアクセスを試みる
Set folder = fso.GetFolder(TARGET_PATH)
If Err.Number <> 0 Then
WScript.Echo “接続喪失を検知: ” & Now
Call AttemptRecovery(fso)
Err.Clear
Else
‘ 正常時はオブジェクトを即座に解放し、メモリをOSへ還元する
Set folder = Nothing
End If
On Error GoTo 0
WScript.Sleep RETRY_INTERVAL
Loop
End Sub
Sub AttemptRecovery(fso)
‘ WScript.Shellを使用してNET USEコマンドで接続を強制再確立させる
Dim shell : Set shell = CreateObject(“WScript.Shell”)
‘ 既存接続を破棄してから再接続を試みるのが定石
shell.Run “cmd /c net use ” & TARGET_PATH & ” /delete /y”, 0, True
shell.Run “cmd /c net use ” & TARGET_PATH, 0, True
WScript.Echo “リカバリ完了: ” & Now
Set shell = Nothing
End Sub
‘ 実行開始
MonitorSharedFolder
—
3. アーキテクトの視点:パフォーマンスと安定性の勘所
メモリ管理の極意
VBScriptにおいて、`Set object = Nothing`を怠ることは、バックグラウンド監視において「死」を意味する。長時間稼働させるプロセスでは、わずかなメモリリークも数週間でシステムを圧迫する。ループ内のオブジェクトは必ずスコープの終了時、または不要になった瞬間に明示的に解放せよ。
WScript.Sleepの功罪
`WScript.Sleep`は、CPU時間を解放する最も安価な手段だ。これをループ内に配置することで、監視モジュールはOSのスケジューラに対して「私は今、待機状態である」と明示できる。これを行わない監視スクリプトは、CPUを不必要に占有し、他の業務アプリケーションのレスポンスを悪化させる「害悪」となる。
エラーハンドリングの境界線
`On Error Resume Next`を広範囲に適用するのはアマチュアの所業だ。上記のコードのように、「接続を確認する特定の行」のみを囲い込むことで、予期せぬロジックエラーを見逃さず、かつネットワークという不安定な外部要因による停止だけを巧みに回避できる。
結びとして
VBScriptは、もはや過去の遺物ではない。適切に設計されたWSH環境は、モダンな高階層言語よりも遥かに軽量に、OSの深部で動き続けることができる。
システムがネットワークの不安定さに屈するたび、エンジニアは「環境のせい」にして逃げ出す。しかし、我々アーキテクトは、その「揺らぎ」を計算に入れたシステムを構築する。それが、レガシーを極めた者にのみ許される、真の自動化の美学だ。
さあ、あなたの監視モジュールに、魂を吹き込め。
