Como posso reiniciar automaticamente um serviço do Windows se ele falhar?

57

Eu tenho um serviço do Windows que sai inesperadamente a cada poucos dias. Existe uma maneira simples de monitorá-lo para garantir que seja reiniciado rapidamente se travar?

Liam
fonte

Respostas:

77

No aplicativo Serviços, selecione as propriedades do serviço em questão.

Veja a guia de recuperação - existem todos os tipos de opções - eu definiria a Primeira e a Segunda falha para reiniciar o serviço, a Terceira para executar um programa em lote que envia um e-mail à BLAT com a terceira notificação de falha.

Você também deve definir a contagem de falhas de redefinição como 1 para redefinir a contagem de falhas diariamente.

EDITAR:

Parece que você pode fazer isso através de uma linha de comando:

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

O seu arquivo MyBatchFile.CMD pode ficar assim:

blat - -body "Service W3svc Failed" -subject "SERVICE ERROR" -to [email protected] -server SMTP.Example.com -f [email protected]
Christopher_G_Lewis
fonte
3
Tudo de bom, mas +1, especialmente para o conselho de notificação por email e para a linha de comando.
Maximus Minimus
Onde o arquivo em lotes deve estar no disco?
Matt
Qualquer lugar. Com SC failure w3svc command= "MyBatchFile.cmd"ele deve estar no caminho ou C: \ Windows \ System32. Você pode colocá-lo em qualquer diretório se você usar um caminho completo, ou seja,SC failure w3svc command= "c:\Stuff\MyBatchFile.cmd"
Christopher_G_Lewis
9

Abra Services.msc, clique duas vezes no serviço para abrir as Propriedades do serviço, há uma guia Recuperação e essas configurações devem permitir que você reinicie o serviço em caso de falha.

jeremyasnyder
fonte
4

Tente definir o tempo de recuperação para zero:

insira a descrição da imagem aqui

O equivalente da linha de comando:

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

De qualquer forma, às vezes a recuperação automática não funciona corretamente e é recomendável usar software de terceiros. Parece que quando o serviço sai normalmente com o código de saída 0, o Windows não tenta recuperá-lo.

MSS
fonte
1

Estou usando o ServiceKeeper no meu servidor Windows 2008 em HostForLife.eu e funciona muito bem. Anteriormente, eu fiz uma revisão no ServiceHawk, mas prefiro usar o ServiceKeeper para facilitar o gerenciamento e a interface.


fonte
1

Eu tinha requisitos semelhantes para iniciar um serviço se interrompido. A solução mais simples que pensei foi executar o comando abaixo no Windows Task Scheduler a cada 5 minutos:

net start MyServiceName

Este comando basicamente iniciará o serviço (se parado) e não terá efeito se o serviço já estiver em execução.

Anderson
fonte
1

Recentemente, implementei uma opção de recuperação para executar um script do PowerShell que tenta reiniciar o serviço um número definido de vezes e envia uma notificação por e-mail na conclusão.

Após várias tentativas (e apesar de todas as outras coisas que já vi), a configuração dos campos na guia de recuperação nos serviços é a seguinte:

Programa: Powershell.exe
** Não em C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Powershell.exe

Parâmetros da linha de comando: -comando "& {SomePath \ YourScript.ps1 '$ args [0]' '$ args [1]' '$ args [n]'}"

por exemplo: -comando "& {C: \ PowershellScripts \ ServicesRecovery.ps1 'Nome do Serviço'}"

** Os $ args são parâmetros que serão passados ​​para o seu script. Estes não são necessários.

Aqui está o script do 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
usuario
fonte
0

Esta foi a minha resposta em um tópico semelhante Espero que isso ajude ...

Você pode agendar um script vbs simples como este para reiniciar periodicamente o serviço no computador, se necessário.

strComputer = "." 
strSvcName = "YOUR_SERVICE_NAME" 
defina objWMI = GetObject ("winmgmts: \\" & strComputer & "\ root \ cimv2")
definir objService = objWMI.Get ("Win32_Service.Name = '" & strSvcName & "'")
If objService.State = "Stopped" Então
    objService.StartService ()
Fim se


Maxwell
fonte
0

Alguém fez uma pergunta semelhante no Superusuário: Você pode instalar uma ferramenta que monitora os serviços do Windows. Algo como o Service Hawk ajudaria você a manter os serviços iniciados ou permitiria o agendamento de reinicializações automáticas (possivelmente durante a noite) para manter o serviço funcionando sem problemas.


fonte