【bat】バッチファイルで特定のプロセスを監視して異常終了を検知する方法

【bat】バッチファイルで特定のプロセスを監視して異常終了を検知する方法 bat

Windows環境において、業務で使用しているアプリケーションやサービスが異常終了していないかを監視したい場合、専用の監視ソフトを使わなくても、バッチファイルを使って簡易的に監視することが可能です。ここでは、特定のプロセスが終了しているかどうかを定期的にチェックし、異常があればログに記録する方法を紹介します。

タスク一覧からプロセスの有無を確認する方法

バッチファイルでは tasklist コマンドを使って、現在起動中のプロセスを確認することができます。たとえば「notepad.exe」が起動中かどうかを判定したい場合、以下のようにします。

tasklist | findstr /I "notepad.exe"

このコマンドの結果が空であれば、そのプロセスは実行されていないことになります。

異常終了を検知してログ出力するバッチファイルの例

以下は、指定したプロセスが存在しない場合にログファイルに記録するサンプルです。

@echo off
setlocal

:: チェック対象のプロセス名を指定
set "TARGET_PROCESS=notepad.exe"

:: ログ出力先
set "LOGFILE=C:\log\process_monitor.log"

:: 日時を取得
for /f "tokens=1-4 delims=/ " %%a in ('date /t') do set DATE=%%a-%%b-%%c
for /f "tokens=1-2 delims=: " %%a in ('time /t') do set TIME=%%a:%%b

:: プロセスの有無をチェック
tasklist | findstr /I "%TARGET_PROCESS%" >nul
if errorlevel 1 (
    echo [%DATE% %TIME%] %TARGET_PROCESS% が終了しています。 >> "%LOGFILE%"
)

endlocal

このスクリプトは、「notepad.exe」が終了していた場合に、C:\log\process_monitor.log にタイムスタンプ付きで記録を残します。

定期実行する方法

監視を自動化するためには、上記のバッチファイルを一定間隔で繰り返し実行する仕組みが必要です。たとえば timeout コマンドとループを使えば、数分おきに監視することもできます。

@echo off
:LOOP
call monitor.bat
timeout /t 300 /nobreak >nul
goto LOOP

上記の例では、monitor.bat(前述の監視バッチ)を5分ごとに実行しています。

実行環境と注意点

この仕組みは簡易的な監視には便利ですが、以下のような点には注意が必要です。

  • 複数の同名プロセスが存在する場合は判定が難しい
  • 一時的な終了も記録されるため、誤検出の対処が必要
  • サービスとして常駐させたい場合はタスクスケジューラやバッチ→VBScript変換などが必要

より本格的な監視には専用のソフトウェア(たとえばNagios、Zabbixなど)の導入も検討しましょう。

まとめ

バッチファイルを活用すれば、簡単なプロセス監視ツールを自作することができます。ログの記録やメール通知などと組み合わせることで、業務の信頼性向上にも貢献できます。ぜひ自分の環境に合わせてカスタマイズしてみてください。