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

47

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

    
por Liam 31.07.2009 / 18:25

8 respostas

69

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

Veja a guia "Recuperação" - há todos os tipos de opções - defini "Primeira & Segunda falha ao reiniciar o serviço Terceiro para executar um programa em lotes que BLAT envia um e-mail 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 por meio de uma linha de comando:

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

Seu arquivo MyBatchFile.CMD pode ser assim:

blat - -body "Service W3svc Failed" -subject "SERVICE ERROR" -to [email protected] -server SMTP.Example.com -f [email protected]
    
por 31.07.2009 / 18:30
8

Abra o 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 após uma falha.

    
por 31.07.2009 / 18:30
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" 
set objWMI = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
set objService = objWMI.Get("Win32_Service.Name='" & strSvcName & "'")
If objService.State= "Stopped" Then
    objService.StartService()
End If


    
por 31.07.2009 / 18:29
0

Alguém fez uma pergunta semelhante no Superusuário: Você pode instalar uma ferramenta que monitore os serviços do Windows. Algo como o Service Hawk ajudaria a manter os serviços iniciados ou permitiria agendar reinicializações automáticas (possivelmente durante a noite) para manter o serviço em execução suavemente.

    
por 12.10.2009 / 03:10
0

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

    
por 12.10.2009 / 05:43
0

Eu tinha requisitos semelhantes para iniciar um serviço, se parado. A solução mais simples que eu pensei foi executar o comando abaixo no agendador de tarefas do Windows a cada 5 minutos:

net start MyServiceName

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

    
por 19.12.2016 / 11:53
0

Implementei recentemente uma opção de recuperação para executar um script do PowerShell que tenta reiniciar o serviço por um determinado número de vezes e envia uma notificação por e-mail na conclusão, também.

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

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

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

por exemplo: -command "& {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
    
por 08.02.2017 / 22:50
0

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

A linha de comando equivalente:

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 sair normalmente com o código de saída de 0 windows não tente recuperá-lo.

    
por 24.04.2018 / 08:57