2009-03-19 13 views
11

Ho visto la domanda "è possibile eseguire Monit su Windows?" E, a meno che non si desideri utilizzare una VM, la risposta sembra essere no.Qualsiasi Monit come equivalenti per Windows OS?

Quindi ... ci sono piccole applicazioni di tipo monit impronte per i sistemi operativi Windows? Quello che sto cercando non è solo il monitoraggio (di cui ci sono centinaia di app), ma anche la possibilità di eseguire uno script o riavviare un servizio. Ad esempio, monitorare una pagina Web e riavviare Tomcat se tale pagina non risponde (non può semplicemente guardare il servizio, perché il servizio è ancora in esecuzione ma non risponde correttamente).

Questo è per una piccola applicazione, non una grande applicazione, quindi le soluzioni pesanti/costose non sono desiderate.

+0

Hah! - una domanda e una risposta di 7 anni sono state messe in attesa. –

risposta

6

Non ho trovato nulla che corrispondesse alle mie esigenze, quindi ho imparato un po 'di scripting di Powershell e ho trovato una soluzione che dovrebbe essere utile anche per gli altri. Supponendo una piattaforma Windows (altrimenti usa monit!), Powershell è davvero potente e facile.

script di esempio-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 
    } 
} 

L'unica logica in questo script è che sarà solo cercare di riavviare il servizio una volta dopo un errore iniziale. Questo serve a prevenire una situazione in cui un servizio richiede un po 'di tempo per riavviarsi, e mentre si sta riavviando, il monitor continua a vedere l'errore e si riavvia di nuovo (ciclo infinito negativo). Altrimenti puoi fare qualsiasi cosa, come aggiungere notifiche via email o fare di più che riavviare un servizio.

Questo script verrà eseguito una volta, il che significa che sarà necessario controllarne la ripetizione esternamente. Potresti inserirlo in un ciclo infinito proprio nella sceneggiatura, ma sembra un po 'squilibrato. Ho usato Windows Task Scheduler, eseguendolo in questo modo: Programma: Powershell.exe argomenti: -comando "C: \ projects \ foo \ scripts \ monitor.ps1" -noprofile Inizio: C: \ projects \ foo \ scripts

È anche possibile utilizzare uno scheduler più robusto come VisualCron, collegarlo a un servizio Windows o tramite uno scheduler del server delle applicazioni come Quart.NET. Nel mio caso l'utilità di pianificazione funziona correttamente.

0

Sto utilizzando ipsentry da RGE Inc (http://www.ipsentry.com/).

Lo uso da diversi anni, mi ha salvato molte volte.

Nessuna affiliazione con loro, questo non è un annuncio, solo informazioni da un cliente soddisfatto.

0

Questo può essere almeno parzialmente eseguito utilizzando Gestione controllo servizi fornito con Windows. Controlla le applicazioni di servizio e può avviarle automaticamente all'avvio, riavviarle quando si blocca, ecc. La scrittura dell'applicazione come servizio è un'opzione, ma se non puoi scrivere l'applicazione come servizio, puoi provare a racchiudere il processo utilizzando srvany.exe nel Resource Kit di Windows.

Maggiori informazioni sulla scrittura di un servizio: https://support.microsoft.com/en-us/kb/137890

Per quanto riguarda le funzioni di monitoraggio attuali, non sono del tutto sicuro di quello che è disponibile, o estendere le capacità di SCM.

1

Ho regolato un po 'lo script di Dan Tanner quando non riusciva a connettersi, ha mostrato un errore e non è stato riavviato il servizio

$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's 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 
}