Назад | Перейти на главную страницу

Перезапустите службу Windows, если сообщение об ошибке в лог-файле

Сервис работает нормально, как видно с sc query Но это не работает. Когда он перестал работать, в лог-файле была ошибка. Поэтому я думаю о том, чтобы запустить своего рода tail -f в файле журнала и перезапустите службу при возникновении ошибки.

У меня есть Powershell версии 1, поэтому я могу отслеживать ошибку следующим образом:

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

Но как я могу выполнять команду каждый раз, когда найден шаблон?

Команды, которые я хочу запустить, когда будут:

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

Мне не обязательно быть демоном. Я могу просто запустить его в cmd.exe.

В основном приветствуются другие решения, которые могут работать в Windows Server 2008 без установки дополнительного программного обеспечения.

Изменить: на основе ввода я придумал этот сценарий:

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."
}

Вроде работает.

Я мог бы запустить из планировщика задач, но затем мне нужно проверить, не старая ли это ошибка, на которую я уже ответил.

Во-первых, вам не нужно sc для управления вашими услугами. Просто используйте Stop-Service и Start-Service (доступно ли оно в 1.0?). Во-вторых, хотя вы сами не тестировали его, вам нужно сделать две вещи:

  1. Поместите ваш скрипт в бесконечные циклы, со спящим режимом или отключите скрипт каждую минуту из планировщика задач.
  2. Измените вас Select-String использовать -Quiet вариант, который возвращает bool

Чем это должно быть так просто, как

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

Надеюсь, поможет.

Запуск этого в длинном error.log, который зарегистрировал остановку службы только один раз, всегда будет перезапускать службу, потому что всегда будет обнаружен текст «Я только что умер». ЕСЛИ последняя строка журнала всегда одна и та же «Я только что умер», если она умерла, то решение простое:

Get-Content error.log -Last 1

Также следует учитывать, что зависшие службы иногда не отвечают на команду «Stop-Service», возможно, вам придется убить процесс с помощью чего-то вроде pskill.exe. Вам нужно это проверить.

Как говорит Дарек, я бы действительно подумал о включении этого в запланированное задание или даже о завершении простой «службы охраны». Если вы перезагружаете журнал, вы не теряете много контроля. Если вы хотите получать уведомления о каждом перезапуске, вы можете просто добавить простое сообщение Send-MailMessage и отправить его вам по электронной почте (боюсь, только PS v3 +).