Любой Monit как эквивалент для ОС Windows?

Я видел, что вопрос спросил: "Можете ли вы запустить Monit в Windows?", и если вы не хотите использовать виртуальную машину, ответ кажется "нет".

Итак... существуют ли какие-то небольшие приложения с монитором для ОС Windows? Я ищу не только мониторинг (из которых сотни приложений), но и возможность выполнить script или перезапустить службу. Например, проверьте веб-страницу и перезапустите Tomcat, если эта страница перестает отвечать на запросы (не может просто смотреть сервис, потому что служба все еще работает, но не отвечает правильно).

Это для небольшого приложения, а не для большого приложения, поэтому не требуются тяжелые/дорогие решения.

Ответ 1

Я не нашел ничего такого, что соответствовало моим потребностям, поэтому я изучил несколько сценариев Powershell и развернул решение, которое должно быть полезным и для других. Предполагая платформу Windows (в противном случае используйте monit!), Powershell действительно мощный и простой.

sample-monitor.ps1 script:

$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 failed since the last successful check.
    if (!(Test-Path $FailureLogFile)) {
        New-Item $FailureLogFile -type file
        "Initial failure:" + $startTime.DateTime >> $FailureLogFile
        Restart-Service $ServiceName
    }
}

Единственная логика в этом script заключается в том, что она только попытается перезапустить службу один раз после первоначального отказа. Это делается для предотвращения ситуации, когда служба перезагружается, а при перезапуске монитор продолжает видеть и снова перезапускается (неудачный бесконечный цикл). В противном случае вы можете сделать что угодно, например, добавить уведомления по электронной почте или сделать больше, чем просто перезапустить службу.

Этот script будет выполняться один раз, что означает, что вам нужно будет контролировать его повторение извне. Вы можете положить его в бесконечный цикл прямо в script, но это кажется немного шелушащимся. Я использовал Windows Task Scheduler, выполнив его так: Программа: Powershell.exe arguments: -command "C:\projects\foo\scripts\monitor.ps1" -noprofile Начало в: C:\projects\foo\scripts

Вы также можете использовать более надежный планировщик, такой как VisualCron, подключить его к службе Windows или через планировщик сервера приложений, такой как Quart.NET. В моем случае планировщик задач работает нормально.

Ответ 2

Я немного подкорректировал Dan Tanner script, когда он не мог подключиться, показал ошибку и не перезапустил службу

$webClient = new-object System.Net.WebClient

###################################################
# BEGIN USER-EDITABLE VARIABLES

# the URL to ping
$HeartbeatUrl = "http://localhost:8080/"

# the response string to look for that indicates things are working ok
$SuccessResponseString = "Apache"

# 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\log.log"

# used to indicate that the service has failed since the last time we checked.
$FailureLogFile = "c:\temp\log2.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
try {
    $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 failed since the last successful check.
        if (!(Test-Path $FailureLogFile)) {
            New-Item $FailureLogFile -type file
            "Initial failure:" + $startTime.DateTime >> $FailureLogFile
            Restart-Service $ServiceName
        }
    }
    }catch [Net.WebException] {
        New-Item $FailureLogFile -type file
        "Initial failure:" + $startTime.DateTime + $_.Exception.ToString() >> $FailureLogFile
        Restart-Service $ServiceName
}

Ответ 3

Я использую ipsentry из RGE Inc (http://www.ipsentry.com/).

Использовали его несколько лет, спасли меня много раз.

Нет связи с ними, это не реклама, а информация от довольного клиента.

Ответ 4

Это может быть, по крайней мере, частично выполнено с помощью диспетчера служб, который поставляется с Windows. Он отслеживает приложения-службы и может автоматически запускать их при загрузке, перезапускать их при сбоях и т.д. Написание вашего приложения как службы - это один из параметров, но если вы не можете записать приложение в качестве службы, вы можете попытаться обернуть процесс используя srvany.exe в наборе ресурсов Windows.

Дополнительная информация о написании службы: https://support.microsoft.com/en-us/kb/137890

Что касается реальных функций мониторинга, я не совсем уверен, что доступно, или расширяет возможности SCM.