Вопрос: Как я могу автоматически перезапустить службу Windows, если она сработает?


У меня есть служба Windows, которая неожиданно выходит каждые несколько дней. Есть ли простой способ контролировать его, чтобы он быстро перезагрузился, если он сработает?


45
2017-07-31 16:25


Источник




Ответы:


В приложении «Службы» выберите свойства данной службы.

Просмотрите вкладку восстановления - есть всевозможные опции - я бы установил First & Second Failure для перезапуска службы, третий для запуска пакетной программы, которая BLATвыдает электронное письмо с третьим уведомлением об отказе.

Вы также должны установить значение Reset Fail Count равным 1 для ежедневного сброса счетчика сбоев.

РЕДАКТИРОВАТЬ:

Похоже, вы можете сделать это через командную строку:

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

Файл MyBatchFile.CMD может выглядеть так:

blat - -body "Service W3svc Failed" -subject "SERVICE ERROR" -to Notify@Example.com -server SMTP.Example.com -f Administrator@Example.com

67
2017-07-31 16:30



Все хорошие вещи, но +1 особенно для рекомендаций по уведомлению по электронной почте и командной строки. - Maximus Minimus
Где пакетный файл находится на диске? - Matt
В любом месте. С SC failure w3svc command= "MyBatchFile.cmd" он должен находиться на пути или C: \ Windows \ System32. Вы можете поместить его в любой каталог, если используете полный путь, т. Е. SC failure w3svc command= "c:\Stuff\MyBatchFile.cmd" - Christopher_G_Lewis


Откройте Services.msc, дважды щелкните по службе, чтобы открыть Свойства службы, есть вкладка «Восстановление», и эти настройки должны позволить вам перезапустить службу при сбое.


8
2017-07-31 16:30





Это был мой ответ на аналогичную нить Надеюсь это поможет...

Вы можете запланировать простой скрипт vbs как этот, чтобы перезапустить службу на компьютере, если это необходимо.

strComputer = "."
strSvcName = "YOUR_SERVICE_NAME"
set objWMI = GetObject ("winmgmts: \\" & strComputer & "\ root \ cimv2")
set objService = objWMI.Get ("Win32_Service.Name = '" & strSvcName & "'")
Если objService.State = "Stopped" Then
    objService.StartService ()
Конец Если



0
2017-07-31 16:29





Кто-то задал аналогичный вопрос в Super User: вы можете установить инструмент, который контролирует службы Windows. Что-то вроде Сервисный ястреб поможет вам сохранить начатые сервисы или позволит запланировать автоматические перезагрузки (возможно, в течение ночи), чтобы обеспечить бесперебойную работу службы.


0
2017-10-12 01:10





я использую ServiceKeeper на моем сервере Windows 2008 на HostForLife.eu, и он работает очень хорошо. Раньше у меня был обзор ServiceHawk, но я предпочитаю использовать ServiceKeeper для упрощения управления и интерфейса.


0
2017-10-12 03:43





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

net start MyServiceName

Эта команда будет в основном запускать службу (если она остановлена) и не имеет никакого эффекта, если служба уже запущена.


0
2017-12-19 10:53





Недавно я реализовал вариант восстановления для запуска сценария powershell, который пытается перезапустить службу определенное количество раз и отправляет уведомление по электронной почте в заключение.

После нескольких попыток (и, несмотря на все остальное, что я видел) Конфигурация полей на вкладке восстановления в службах выглядит следующим образом:

Программа: Powershell.exe
   ** Не C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Powershell.exe

Параметры командной строки: -command "& {SomePath \ YourScript.ps1 '$ args [0]' '$ args [1]' '$ args [n]'}"

например: -command "& {C: \ PowershellScripts \ ServicesRecovery.ps1" Имя службы "}"

** $ args - это параметры, которые будут переданы вашему скрипту. Это не требуется.

вот сценарий 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

0
2018-02-08 21:50





Попробуйте установить время восстановления до нуля:

enter image description here

Соответствие командной строки:

SC failure YOUR_SERVICE_NAME reset= 0 actions= restart/0/restart/0/restart/0

В любом случае автоматическое восстановление не работает корректно, и рекомендуется использовать стороннее программное обеспечение. Похоже, что при выходе сервиса изящно с кодом выхода из 0 окон не пытайтесь его восстановить.


0
2018-04-24 06:57