Respostas:
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 Notify@Example.com -server SMTP.Example.com -f Administrator@Example.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"
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.
Tente definir o tempo de recuperação para zero:
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.
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.
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.
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 = "Name@domain.com"
$FromAddress = "Name@domain.com"
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 = "Name@domain.com"
$FromAddress = "Name@domain.com"
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
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
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.