屍を超えてきたシステム管理者へ:FSOで仕留める「沈黙の障害」検知アーキテクチャ
システムが「動いている」と信じている時ほど、現場は危機に瀕している。
バッチ処理が完了したはずなのに、出力されたのは空っぽの0バイトファイル。あるいは、無限ログ出力のバグにより、ディスクを数分で食い尽くす巨大なゴミファイル。これらは「エラー」ではなく「沈黙」としてシステムに居座る。
VBScriptはレガシーと揶揄されるが、Windowsの深淵に直接アクセスできる唯一無二の軽量スクリプトエンジンだ。今回は、FSO(FileSystemObject)を駆使し、リソースを極限まで絞り込みながら、この「沈黙の障害」を検知・排除するアーキテクチャを伝授する。
—
1. メモリの「ゴミ」を許さない:オブジェクト管理の鉄則
VBScriptにおけるFSOの扱いで初心者が犯す最大の過ちは、オブジェクトのインスタンス化をループ内で行い、メモリリークを放置することだ。特に監視対象が数千ファイルに及ぶ場合、COMオブジェクトの解放漏れは即座にメモリ枯渇を招く。
我々が書くコードは「堅牢」でなければならない。明示的な `Nothing` への代入は単なる儀式ではなく、参照カウントを即時デクリメントし、メモリを解放させるための「意志」である。
—
2. 異常検知エンジン:実装コード
以下は、指定ディレクトリ下のファイルをスキャンし、閾値外のファイルをリスト化するプロフェッショナル・グレードのスクリプトだ。
‘ ——————————————————————
‘ System Sentinel: Silent Failure Detector
‘ 異常ファイル検知・レポートスクリプト
‘ ——————————————————————
Option Explicit
‘ 定数定義
Const TARGET_DIR = “C:\Logs\AppOutput”
Const LOG_FILE = “C:\Logs\Monitor_Report.log”
Const MAX_SIZE = 104857600 ‘ 100MBを上限とする
Const MIN_SIZE = 0 ‘ 0バイトを異常とみなす
Dim fso, folder, file
Dim objLog
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set objLog = fso.OpenTextFile(LOG_FILE, 8, True) ‘ 8: ForAppending
If fso.FolderExists(TARGET_DIR) Then
Set folder = fso.GetFolder(TARGET_DIR)
‘ ファイルスキャン開始
For Each file In folder.Files
‘ 異常検知ロジック
If file.Size = MIN_SIZE Then
objLog.WriteLine Now & ” [ALERT] Zero-byte detected: ” & file.Path
ElseIf file.Size > MAX_SIZE Then
objLog.WriteLine Now & ” [ALERT] Over-size detected: ” & file.Path & ” (” & file.Size & ” bytes)”
End If
Next
Else
objLog.WriteLine Now & ” [ERROR] Target directory not found: ” & TARGET_DIR
End If
‘ 資源の解放(ここを疎かにする者はプロとは呼べない)
Set objLog = Nothing
Set folder = Nothing
Set fso = Nothing
WScript.Quit 0
—
3. チーフアーキテクトからの深掘り:パフォーマンスの最適化
このコードをそのまま運用環境へ投入する際、さらに一段上のパフォーマンスを求めるならば、以下の2点に留意せよ。
① 再帰的スキャンとオーバーヘッド
`Folder.Files` はディレクトリ内の全ファイル情報をメモリに展開する。もし対象が数万ファイルを超える場合、このループはI/O待ちでシステムを一時停止させる可能性がある。スキャン間隔(タスクスケジューラの設定)は、ディスクのI/O負荷を計算し、適切にオフセットをかけろ。
② WMI/Windows APIとの併用
FSOは便利だが、ファイルの「最終更新時刻」や「所有者」など、より高度なメタデータが必要な場合は、`WMI (Win32_LogicalFileSecuritySetting)` を呼び出す必要がある。FSOでアタリを付け、詳細な解析が必要なファイルのみをWMIで叩く。これが、システム全体に負荷をかけない「スマートな監視」の極意だ。
—
4. なぜ今、VBScriptなのか
モダンな言語がある中で、なぜVBScriptを使い続けるのか。理由はシンプルだ。
「どんなに古いWindows環境でも、追加インストールなしで即座に動作する」からだ。
クラウド全盛の今であっても、閉鎖的なオンプレミス環境や、レガシーなWindows Server 2008/2012環境は依然として存在する。そこでは、.NET Frameworkのバージョン依存や依存ライブラリの管理で頭を悩ませるより、ネイティブのVBScriptで「確実に動く」ツールを置いておく方が、遥かに高い信頼性を担保できる。
最後に
システム監視とは、異常を見つけることではなく、「異常が起きない状態」を維持し続けることだ。このスクリプトをタスクスケジューラに組み込み、ログを監視ツール(ZabbixやDatadog等)に連携させれば、君のシステムは「沈黙の障害」から完全に解放されるだろう。
コードを書け。そして、誰よりも早く障害に気付け。それがアーキテクトの矜持だ。
