【テクニカル・上級編】【ネットワークパス非同期監視】FileSystemObjectとSleepループを用いた共有フォルダ接続状態の自動リカバリ – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

共有フォルダの「死」を看取る: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の深部で動き続けることができる。

システムがネットワークの不安定さに屈するたび、エンジニアは「環境のせい」にして逃げ出す。しかし、我々アーキテクトは、その「揺らぎ」を計算に入れたシステムを構築する。それが、レガシーを極めた者にのみ許される、真の自動化の美学だ。

さあ、あなたの監視モジュールに、魂を吹き込め。

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