Reinicie o serviço do Windows se a mensagem de erro no arquivo de log

1

O serviço está funcionando bem, como visto com sc query , mas não funciona. Quando parou de funcionar, houve um erro no arquivo de log. Então, penso em executar uma espécie de tail -f no arquivo de log e reiniciar o serviço quando ocorrer um erro.

Eu tenho a versão 1 do Powershell, então posso acompanhar o erro com isso:

Get-Content error.log -Wait | Select-String -pattern "I just died"

Mas como posso executar um comando toda vez que o padrão é encontrado?

Os comandos que quero executar quando seriam:

echo "Stopping service" >> restart.log
sc stop "Floffy dude"
sc start "Floffy dude"
Get-Date >> restart.log
echo "Restart done" >> restart.log

Eu não preciso ser um deamon. Eu posso apenas executá-lo em um cmd.exe.

Outras soluções que podem ser executadas no Windows Server 2008 sem instalar mais software são muito bem-vindas.

Editar: Com base na entrada, criei este script:

Get-Content -Wait error.log | Select-String -SimpleMatch "I just died" | ForEach-Object -Process {
    $now = Get-Date -Format "yyyy-MM-dd HH:mm"
    Echo "$now Restart: Floffy - $_"
    Restart-Service "Floffy"
    $now = Get-Date -Format "yyyy-MM-dd HH:mm"
    Echo "$now Restart done."
}

Parece funcionar.

Eu poderia executar a partir do agendador de tarefas, mas depois tenho que verificar se é um erro antigo que eu já respondi.

    
por Hans Schou 29.07.2016 / 13:12

2 respostas

3

Primeiro de tudo, você não precisa de sc para controlar seus serviços. Apenas use Stop-Service e Start-Service (está disponível em 1.0?). Segundo, no entanto, não tendo testado eu mesmo, você precisa fazer duas coisas:

  1. Coloque seu script em um loop infinito, com o sono ou o chute do script a cada minuto do agendador de tarefas.
  2. Altere você Select-String para usar a opção -Quiet , que retorna um bool

Do que deveria ser tão simples quanto

if(Get-Content error.log -Wait | Select-String -pattern "I just died" -Quiet){
   #stop and start services here
}

Espero que ajude.

    
por 30.07.2016 / 03:47
0

Executar isso em um longo error.log que registrou o serviço interrompendo apenas uma vez sempre reiniciará o serviço, porque ele sempre encontrará o texto "Acabei de morrer". Se a última linha do log é sempre o mesmo "eu acabei de morrer" se ele morreu, então a solução é simples:

Get-Content error.log -Last 1

Outra coisa a considerar é que os serviços suspensos às vezes não respondem ao "Stop-Service", você pode ter que matar o processo com algo como pskill.exe. Você precisará testar isso.

Como diz Darek, eu realmente consideraria colocar isso em uma tarefa agendada ou até mesmo encerrar um simples "serviço de guardião". Se você registrar a reinicialização, não perderá muito controle. Se você quiser ser notificado de cada reinicialização, você pode simplesmente enviar um simples Send-MailMessage e mandar um e-mail para você (somente PS v3 +).

    
por 30.07.2016 / 12:19