¿Cómo puedo reiniciar automáticamente un servicio de Windows si falla?

57

Tengo un servicio de Windows que se cierra inesperadamente cada pocos días. ¿Hay una manera simple de monitorearlo para asegurarse de que se reinicie rápidamente si falla?

Liam
fuente

Respuestas:

77

En la aplicación Servicios, seleccione las propiedades del servicio en cuestión.

Ver la pestaña de recuperación (hay todo tipo de opciones). Establecería el primer y el segundo fallo para reiniciar el servicio, tercero para ejecutar un programa por lotes que envía un correo electrónico a BLAT con la tercera notificación de fallo.

También debe establecer el Restablecer recuento de fallas en 1 para restablecer el recuento de fallas diariamente.

EDITAR:

Parece que puedes hacer esto a través de una línea de comando:

SC failure w3svc reset= 432000  actions= restart/30000/restart/60000/run/60000
SC failure w3svc command= "MyBatchFile.cmd"

Su archivo MyBatchFile.CMD puede verse así:

blat - -body "Service W3svc Failed" -subject "SERVICE ERROR" -to [email protected] -server SMTP.Example.com -f [email protected]
Christopher_G_Lewis
fuente
3
Todas las cosas buenas, pero +1 especialmente para el aviso de notificación por correo electrónico y las cosas de la línea de comandos.
Maximus Minimus
¿Dónde debe vivir el archivo por lotes en el disco?
Matt
En cualquier sitio. Con SC failure w3svc command= "MyBatchFile.cmd"esto debe estar en la ruta o C: \ Windows \ System32. Puede ponerlo en cualquier directorio si utiliza una ruta completa, es decirSC failure w3svc command= "c:\Stuff\MyBatchFile.cmd"
Christopher_G_Lewis
9

Abra Services.msc, haga doble clic en el servicio para abrir las Propiedades del servicio, hay una pestaña Recuperación y esa configuración debería permitirle reiniciar el servicio en caso de falla.

jeremyasnyder
fuente
4

Intente establecer el tiempo de recuperación en cero:

ingrese la descripción de la imagen aquí

La línea de comando equivalente:

SC failure YOUR_SERVICE_NAME reset= 0 actions= restart/0/restart/0/restart/0

De todos modos, a veces la recuperación automática no funciona correctamente y se recomienda utilizar software de terceros. Parece que cuando el servicio sale con gracia con el código de salida de 0 ventanas, no intente recuperarlo.

MSS
fuente
1

Estoy usando ServiceKeeper en mi servidor de Windows 2008 en HostForLife.eu y funciona muy bien. Anteriormente, tenía una revisión sobre ServiceHawk, pero prefiero usar ServiceKeeper para su administración e interfaz más fáciles.


fuente
1

Tenía un requisito similar para iniciar un servicio si se detenía. La solución más simple que pensé fue ejecutar el siguiente comando en el programador de tareas de Windows cada 5 minutos:

net start MyServiceName

Este comando básicamente iniciará el servicio (si está detenido) y no tendrá efecto si el servicio ya se está ejecutando.

Anderson
fuente
1

Recientemente implementé una opción de recuperación para ejecutar un script de PowerShell que intenta reiniciar el servicio un número definido de veces y envía una notificación por correo electrónico al final, también.

Después de varios intentos (y a pesar de todas las otras cosas que he visto) La configuración de los campos en la pestaña de recuperación en los servicios es la siguiente:

Programa: Powershell.exe
** No C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Powershell.exe

Parámetros de línea de comando: -command "& {SomePath \ YourScript.ps1 '$ args [0]' '$ args [1]' '$ args [n]'}"

por ejemplo: -command "& {C: \ PowershellScripts \ ServicesRecovery.ps1 'Nombre del servicio'}"

** Los $ args son parámetros que se pasarán a tu script. Estos no son obligatorios.

Aquí está el script de PowerShell:

cd $PSScriptRoot

$n = $args[0]

function CreateLogFile {
$events = Get-EventLog -LogName Application -Source SomeSource -Newest 40
if (!(Test-Path "c:\temp")) {
    New-Item -Path "c:\temp" -Type directory}
if (!(Test-Path "c:\temp\ServicesLogs.txt")) {
    New-Item -Path "c:\temp" -Type File -Name "ServicesLogs.txt"}
    $events | Out-File -width 600 c:\temp\ServicesLogs.txt
}

function SendEmail  {
$EmailServer = "SMTP Server"
$ToAddress = "[email protected]"
$FromAddress = "[email protected]"

CreateLogFile

$Retrycount = $Retrycount + 1
send-mailmessage -SmtpServer $EmailServer -Priority High -To $ToAddress -From $FromAddress -Subject "$n Service failure" `
-Body "The $n service on server $env:COMPUTERNAME has stopped and was unable to be restarted after $Retrycount attempts." -Attachments c:\temp\ServicesLogs.txt

Remove-Item "c:\temp\ServicesLogs.txt"
}

function SendEmailFail  {
$EmailServer = "SMTP Server"
$ToAddress = "[email protected]"
$FromAddress = "[email protected]"

CreateLogFile

$Retrycount = $Retrycount + 1
send-mailmessage -SmtpServer $EmailServer -Priority High -To $ToAddress -From $FromAddress -Subject "$n Service Restarted" `
-Body "The $n service on server $env:COMPUTERNAME stopped and was successfully restarted after $Retrycount attempts. The relevant system logs are attached." -Attachments c:\temp\ServicesLogs.txt

Remove-Item "c:\temp\ServicesLogs.txt"
}

function StartService {

$Stoploop = $false

do {
   if ($Retrycount -gt 3){
     $Stoploop = $true
     SendEmail
     Break
    }

   $i =  Get-WmiObject win32_service | ?{$_.Name -imatch $n} | select Name, State, StartMode
    if ($i.State -ne "Running" -and $i.StartMode -ne "Disabled") {

        sc.exe start $n
        Start-Sleep -Seconds 35

        $i =  Get-WmiObject win32_service | ?{$_.Name -imatch $n} | select State
          if ($i.state -eq "Running"){
              $Stoploop = $true
              SendEmailFail}
          else {$Retrycount = $Retrycount + 1}
    }        
}
While ($Stoploop -eq $false)
}

[int]$Retrycount = "0"
StartService
Mella
fuente
0

Esta fue mi respuesta en un hilo similar Espero que esto ayude ...

Puede programar un script vbs simple como este para reiniciar periódicamente el servicio en la computadora si es necesario.

strComputer = "." 
strSvcName = "YOUR_SERVICE_NAME" 
set objWMI = GetObject ("winmgmts: \\" & strComputer & "\ root \ cimv2")
set objService = objWMI.Get ("Win32_Service.Name = '" & strSvcName & "'")
If objService.State = "Stopped" Entonces
    objService.StartService ()
Terminara si


Maxwell
fuente
0

Alguien hizo una pregunta similar en Super User: podría instalar una herramienta que supervise los servicios de Windows. Algo como Service Hawk lo ayudaría a mantener los servicios iniciados o le permitiría programar reinicios automáticos (posiblemente durante la noche) para mantener el servicio funcionando sin problemas.


fuente