ネットワークの「揺らぎ」を制御せよ:VBScriptによる共有フォルダ監視と自己修復の実践
現場で「共有フォルダが見つかりません」というエラーに泣かされるのは、もう終わりにしよう。
ネットワークドライブの切断は、インフラの宿命だ。VPNの瞬断、サーバーのパッチ適用、あるいは単なるWi-Fiの気まぐれ。これらを「例外」として放置し、スクリプトを停止させてしまうのはエンジニアの怠慢だ。
今日は、VBScriptとWSH(Windows Script Host)を駆使し、「沈黙するネットワーク」に対して自己修復能力を持たせるための、堅牢な監視モジュール設計を伝授する。
—
1. なぜ「単純なループ」ではいけないのか
多くの初学者は、単に `FSO.FolderExists` を無限ループさせるコードを書く。しかし、それは死を招く。
- リソースリーク: `FileSystemObject` をループ内でむやみにインスタンス化し続けると、メモリ管理が甘いWSH環境では遅延と不安定化を招く。
- CPUの暴走: `Sleep` を入れない、あるいは間隔が短すぎると、CPUを100%消費し、監視対象のサーバーどころかホスト側のOSまで応答不能にする。
- 同期の罠: ネットワークの不調時、再接続要求がOSレベルでスタックし、スクリプトが「ゾンビ化」する。
我々が目指すべきは、「軽量で、かつOSに負荷をかけない生存監視」だ。
—
2. 堅牢な監視モジュールの設計指針
プロダクションレベルの自動化では、以下の3点を徹底する。
1. オブジェクトの再利用: ループの外側でFSOを生成し、内側ではメソッドのみを呼ぶ。
2. 指数バックオフの考慮: 接続失敗が続いた場合、リトライ間隔を徐々に広げることで、ネットワーク負荷を抑制する(今回は実用性を考慮し固定間隔で実装するが、設計思想には組み込む)。
3. WSHの利点を活かす: `WScript.Sleep` はCPUを解放する唯一の手段である。これを戦略的に使用する。
—
3. プロダクションコード:共有フォルダ自動リカバリ
このコードは、指定したパスが消滅している間、静かに待機し、復旧した瞬間に処理を再開する設計だ。
‘ — 監視設定 —
Const MONITOR_PATH = “\\Server\SharedFolder\Data”
Const RETRY_INTERVAL = 5000 ‘ 5秒おきにチェック
Const MAX_RETRIES = 12 ‘ 最大1分で諦める設定(必要に応じて調整)
Set fso = CreateObject(“Scripting.FileSystemObject”)
Function EnsureConnection(path)
Dim retryCount
retryCount = 0
Do While Not fso.FolderExists(path)
retryCount = retryCount + 1
WScript.Echo “警告: パスが見つかりません [” & path & “] リトライ: ” & retryCount
‘ 接続が切れている間はCPUを解放し待機
WScript.Sleep RETRY_INTERVAL
If retryCount >= MAX_RETRIES Then
EnsureConnection = False
Exit Function
End If
Loop
EnsureConnection = True
End Function
‘ — メイン処理 —
If EnsureConnection(MONITOR_PATH) Then
WScript.Echo “接続成功。処理を開始します。”
‘ ここに本来の業務ロジックを記述する
‘ 例: fso.MoveFile … etc
Else
WScript.Echo “致命的なエラー: ネットワーク復旧を確認できませんでした。”
WScript.Quit 1
End If
Set fso = Nothing
—
4. 現場で生き残るための「運用上の注意」
このモジュールを運用に乗せる際、以下の「落とし穴」を回避すること。
- ファイルロックの競合: ネットワークが復旧した瞬間、即座にファイル操作を開始してはいけない。サーバー側で「ファイルの書き込み完了待ち」が発生している可能性がある。再接続確認後、念のために2〜3秒のバッファ(`WScript.Sleep 2000`)を入れるのが大人の流儀だ。
- ログ出力の設計: `WScript.Echo` はダブルクリック実行時には表示されない。必ず `cscript.exe` で実行し、ログをテキストファイルへリダイレクト(`> log.txt 2>&1`)して保存する習慣をつけろ。
- 権限の分離: ネットワークパスへのアクセスは、スクリプト実行ユーザーの権限に依存する。タスクスケジューラで実行する場合は「最上位の権限で実行する」にチェックを入れるだけでなく、実行ユーザーの認証情報を明示的に管理せよ。
最後に
VBScriptは、今や「レガシー」と呼ばれることもある。だが、OSに深く根を下ろし、数行のコードでインフラの脆弱性を補完できるこの言語の力は、クラウド全盛の今こそ再評価されるべきだ。
「エラーが出るのは仕方がない」。そこから先が、エンジニアの腕の見せ所だ。自動化とは、システムを「止めない」ことではなく、「止まったシステムを、いかにエレガントに復旧させるか」という哲学に他ならない。
君の作るツールが、明日からの現場を少しでも楽にすることを期待している。健闘を祈る。
