VBScriptでサーバーの鼓動を聴く――『ポート監視スクリプト』でインフラ管理を極める
こんにちは。システム自動化の現場で長年、泥臭いスクリプトと格闘してきたエンジニアです。
皆さんは「サーバーが落ちていないか」「ポートが正しく開いているか」を確認するために、わざわざブラウザやツールを開いて確認していませんか? その手間、VBScriptで今日から自動化しましょう。
今回は、Windows標準の `WScript.Shell` と `netstat` コマンドを組み合わせ、「特定のポートが生きているか」を監視するプロ級のスクリプトの構築術を伝授します。
—
1. なぜ「VBScript」なのか?
「今どきPythonじゃないの?」という声が聞こえてきそうですね。しかし、VBScriptの真髄は「インストール不要」「どのWindows環境でも動く」という圧倒的な即効性にあります。
情シス部門や保守現場では、セキュリティ制限で新しいソフトウェアを入れられないことが多々あります。そんな時、メモ帳さえあれば即座に実行できるVBScriptは、今なお現役最強の現場ツールなのです。
—
2. 監視ロジックの設計図
今回作成するスクリプトは、以下のステップで動作します。
1. コマンドの発行: `netstat -an` を実行し、全通信状況を吸い上げる。
2. ストリーム処理: `Exec` メソッドで結果を標準出力から取得する。
3. 文字列検索: 取得した文字列の中から、監視対象のポート番号が含まれる行を探す。
4. 判定: 状態(LISTEN等)を確認し、結果をメッセージやログに出力する。
—
3. 実践コード:ポート監視スクリプト
以下のコードをコピーして、拡張子 `.vbs` で保存してください。
Option Explicit
‘ 監視設定
Dim targetPort, checkInterval
targetPort = “80” ‘ 監視したいポート番号
checkInterval = 5000 ‘ 5秒間隔
WScript.Echo “ポート ” & targetPort & ” の監視を開始します…”
Do
If IsPortActive(targetPort) Then
‘ 正常時の挙動(ログ出力など)
‘ WScript.Echo Now & ” [OK] Port ” & targetPort & ” is Active.”
Else
‘ 異常検知時の挙動
MsgBox “警告: ポート ” & targetPort & ” が応答していません!”, 16, “監視アラート”
End If
WScript.Sleep checkInterval
Loop
‘ ポートの生存確認を行う関数
Function IsPortActive(port)
Dim shell, execObj, output, line
Set shell = CreateObject(“WScript.Shell”)
‘ netstatコマンドを実行。-an は全接続を数値で表示するオプション
Set execObj = shell.Exec(“netstat -an”)
output = execObj.StdOut.ReadAll
‘ 行ごとに分割して検索
Dim lines
lines = Split(output, vbCrLf)
IsPortActive = False
For Each line In lines
‘ ポート番号と “LISTENING” または “ESTABLISHED” を含む行を探す
If InStr(line, “:” & port) > 0 Then
If InStr(line, “LISTENING”) > 0 Or InStr(line, “ESTABLISHED”) > 0 Then
IsPortActive = True
Exit Function
End If
End If
Next
End Function
—
4. 現場で陥りやすい罠と対策
① `Run` と `Exec` の使い分け
初心者がよくやる間違いが、`Shell.Run` を使ってしまうことです。`Run` はコマンドをただ起動するだけで、出力結果をスクリプト側で受け取れません。今回は結果をパース(解析)する必要があるため、必ず `StdOut` を扱える `Exec` を使いましょう。
② 文字列検索の精度
`InStr(line, “:” & port)` という記述は非常に重要です。なぜなら、単に `port` だけを指定すると、`18080` ポートまで「80」として検知してしまう可能性があるからです。ポート番号の先頭にコロン(`:`)を付けることで、正確なポート指定を実現しています。
③ 権限の壁
監視対象のサービスによっては、管理者権限で実行しないと `netstat` の結果に一部の情報しか表示されない場合があります。スクリプトが正しく動かないときは、コマンドプロンプトを「管理者として実行」した上で起動してみてください。
—
5. 次のステップへ
このスクリプトは、単なる監視の第一歩です。
ここから発展させるなら、以下のような拡張が考えられます。
- ログ出力: `Scripting.FileSystemObject` を使い、結果をテキストファイルに追記する。
- メール通知: CDO (Collaboration Data Objects) を使い、エラー時にメールを飛ばす。
VBScriptを使いこなせれば、あなたのPCは単なる作業台から、24時間文句を言わずに働く「優秀な部下」へと進化します。
「動いた!」という感動をぜひ体験してください。もし詰まったら、いつでも聞きに来てくださいね。エンジニアとして、あなたの挑戦を心から応援しています。
