Jak mogę automatycznie zrestartować usługę Windows, jeśli ulegnie awarii?

57

Mam usługę Windows, która niespodziewanie wychodzi co kilka dni. Czy istnieje prosty sposób monitorowania, aby upewnić się, że zostanie szybko zrestartowany, jeśli ulegnie awarii?

Liam
źródło

Odpowiedzi:

77

W aplikacji Usługi wybierz właściwości danej usługi.

Wyświetl zakładkę odzyskiwania - istnieją różne opcje - ustawię Pierwszą i drugą nieudaną próbę ponownego uruchomienia usługi, Trzecią, aby uruchomić program wsadowy, który BLAT wyśle wiadomość e-mail z trzecim powiadomieniem o awarii.

Powinieneś także ustawić Resetuj Licznik awarii na 1, aby codziennie resetować licznik awarii.

EDYTOWAĆ:

Wygląda na to, że możesz to zrobić za pomocą wiersza poleceń:

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

Twój plik MyBatchFile.CMD może wyglądać następująco:

blat - -body "Service W3svc Failed" -subject "SERVICE ERROR" -to [email protected] -server SMTP.Example.com -f [email protected]
Christopher_G_Lewis
źródło
3
Wszystkie dobre rzeczy, ale +1, szczególnie w przypadku powiadomień e-mail i wiersza poleceń.
Maximus Minimus
Gdzie plik wsadowy powinien znajdować się na dysku?
Matt
Gdziekolwiek. Ze SC failure w3svc command= "MyBatchFile.cmd"powinien on znajdować się w ścieżce lub C: \ Windows \ System32. Możesz umieścić go w dowolnym katalogu, jeśli użyjesz pełnej ścieżki, tj.SC failure w3svc command= "c:\Stuff\MyBatchFile.cmd"
Christopher_G_Lewis
9

Otwórz Services.msc, kliknij dwukrotnie usługę, aby otworzyć Właściwości usługi, znajduje się karta Odzyskiwanie, a te ustawienia powinny umożliwić ponowne uruchomienie usługi po awarii.

jeremyasnyder
źródło
4

Spróbuj ustawić czas odzyskiwania na zero:

wprowadź opis zdjęcia tutaj

Odpowiednik wiersza poleceń:

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

W każdym razie czasami automatyczne odzyskiwanie nie działa poprawnie i zaleca się korzystanie z oprogramowania innych firm. Wygląda na to, że usługa z wdziękiem kończy pracę z kodem wyjścia 0 okien, nie próbuje go odzyskać.

MSS
źródło
1

Korzystam z ServiceKeeper na serwerze Windows 2008 na HostForLife.eu i działa bardzo dobrze. Wcześniej miałem recenzję na ServiceHawk, ale wolę używać ServiceKeeper dla łatwiejszego zarządzania i interfejsu.


źródło
1

Miałem podobny wymóg, aby uruchomić usługę, jeśli zostanie zatrzymana. Najprostszym rozwiązaniem, jakie myślałem, było wykonanie poniższego polecenia w harmonogramie zadań systemu Windows co 5 minut:

net start MyServiceName

To polecenie w zasadzie uruchomi usługę (jeśli zostanie zatrzymana) i nie będzie miało wpływu, jeśli usługa jest już uruchomiona.

Anderson
źródło
1

Niedawno wdrożyłem opcję odzyskiwania, aby uruchomić skrypt PowerShell, który próbuje ponownie uruchomić usługę określoną liczbę razy i wysyła powiadomienie e-mail na zakończenie, to także.

Po kilku próbach (i pomimo wszystkich innych rzeczy, które widziałem) Konfiguracja pól na karcie odzyskiwania w usługach jest następująca:

Program: Powershell.exe
** Nie C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Powershell.exe

Parametry wiersza poleceń: -command "& {SomePath \ YourScript.ps1 '$ args [0]' '$ args [1]' '$ args [n]'}”

np .: -command "& {C: \ PowershellScripts \ ServicesRecovery.ps1„ Nazwa usługi ”}”

** Argenty $ to parametry, które zostaną przekazane do skryptu. Nie są wymagane.

oto skrypt 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
Nacięcie
źródło
0

To była moja odpowiedź na podobny wątek. Mam nadzieję, że to pomaga ...

Możesz zaplanować prosty skrypt VBS, taki jak ten, aby okresowo uruchamiał usługę na komputerze w razie potrzeby.

strComputer = "." 
strSvcName = "YOUR_SERVICE_NAME" 
set objWMI = GetObject ("winmgmts: \\" & strComputer & "\ root \ cimv2")
set objService = objWMI.Get („Win32_Service.Name = '” & strSvcName & „” ”)
Jeśli objService.State = "Stopped" Wtedy
    objService.StartService ()
End If


Maxwell
źródło
0

Ktoś zadał podobne pytanie w Super User: Możesz zainstalować narzędzie, które monitoruje usługi Windows. Coś w rodzaju Service Hawk pomoże ci utrzymać usługi uruchomione lub pozwoli ci zaplanować automatyczne ponowne uruchomienie (być może w nocy), aby usługa działała sprawnie.


źródło