自分のニーズに合ったものが見つからなかったので、Powershell スクリプトを少し学び、他の人にも役立つはずのソリューションを展開しました。Windows プラットフォームを想定すると (それ以外の場合は monit を使用してください)、Powershell は非常に強力で簡単です。
サンプル-monitor.ps1 スクリプト:
$webClient = new-object System.Net.WebClient
###################################################
# BEGIN USER-EDITABLE VARIABLES
# the URL to ping
$HeartbeatUrl = "http://someplace.com/somepage/"
# the response string to look for that indicates things are working ok
$SuccessResponseString = "Some Text"
# the name of the windows service to restart (the service name, not the display name)
$ServiceName = "Tomcat6"
# the log file used for monitoring output
$LogFile = "c:\temp\heartbeat.log"
# used to indicate that the service has failed since the last time we checked.
$FailureLogFile = "c:\temp\failure.log"
# END USER-EDITABLE VARIABLES
###################################################
# create the log file if it doesn't already exist.
if (!(Test-Path $LogFile)) {
New-Item $LogFile -type file
}
$startTime = get-date
$output = $webClient.DownloadString($HeartbeatUrl)
$endTime = get-date
if ($output -like "*" + $SuccessResponseString + "*") {
# uncomment the below line if you want positive confirmation
#"Success`t`t" + $startTime.DateTime + "`t`t" + ($endTime - $startTime).TotalSeconds + " seconds" >> $LogFile
# remove the FailureLog if it exists to indicate we're in good shape.
if (Test-Path $FailureLogFile) {
Remove-Item $FailureLogFile
}
}
else {
"Fail`t`t" + $startTime.DateTime + "`t`t" + ($endTime - $startTime).TotalSeconds + " seconds" >> $LogFile
# restart the service if this is the first time it's failed since the last successful check.
if (!(Test-Path $FailureLogFile)) {
New-Item $FailureLogFile -type file
"Initial failure:" + $startTime.DateTime >> $FailureLogFile
Restart-Service $ServiceName
}
}
このスクリプトの唯一のロジックは、最初の失敗の後、サービスの再起動を 1 回だけ試行することです。これは、サービスの再起動に時間がかかり、再起動中にモニターが障害を認識し続けて再起動する (悪い無限ループ) という状況を防ぐためです。それ以外の場合は、メール通知を追加したり、サービスを再起動するだけでなく、何でもできます。
このスクリプトは 1 回実行されるため、繰り返しを外部で制御する必要があります。スクリプト内で無限ループに入れることもできますが、それは少し不安定に思えます。Windows タスク スケジューラを使用して、次のように実行しました。 プログラム: Powershell.exe 引数: -command "C:\projects\foo\scripts\monitor.ps1" -noprofile 開始: C:\projects\foo\scripts
VisualCron などのより堅牢なスケジューラを使用して、Windows サービスにプラグインするか、Quart.NET などのアプリケーション サーバー スケジューラを使用することもできます。私の場合、タスク スケジューラは正常に動作します。