Сервис работает нормально, как видно с 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?). Во-вторых, хотя вы сами не тестировали его, вам нужно сделать две вещи:
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 +).