it-swarm-ru.tech

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

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

57
Liam

Под приложением Службы выберите свойства рассматриваемой службы.

Посмотрите вкладку восстановления - есть все виды опций - я бы установил первый и второй сбой для перезапуска службы, третий - для запуска пакетной программы, которая [~ ~ ~] blat [~ # ~] вышло письмо с уведомлением о третьем сбое.

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

EDIT:

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

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 [email protected] -server SMTP.Example.com -f [email protected]
79
Christopher_G_Lewis

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

9
jeremyasnyder

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

enter image description here

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

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

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

4
MSS

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

net start MyServiceName

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

1
Anderson

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

1
Play_Park

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

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

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

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

например: -команда "& {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 = "[email protected]"
$FromAddress = "[email protected]"

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 = "[email protected]"
$FromAddress = "[email protected]"

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
1
Nick

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

0
ExtraLean

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

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

 strComputer = "." 
 strSvcName = "YOUR_SERVICE_NAME" 
 set objWMI = GetObject ("winmgmts: \\" & strComputer & "\ root\cimv2") 
 set objService = objWMI.Get ("Win32_Service .Name = '"& strSvcName &"' ") 
 If objService.State =" Stopped "Тогда 
 ObjService.StartService () 
 End If 


0
Maxwell