Bagaimana saya bisa secara otomatis me-restart layanan Windows jika crash?

57

Saya memiliki layanan Windows yang keluar secara tak terduga setiap beberapa hari. Apakah ada cara sederhana untuk memantaunya untuk memastikan restart dengan cepat jika crash?

Liam
sumber

Jawaban:

77

Di bawah aplikasi Layanan, pilih properti layanan yang dimaksud.

Lihat tab pemulihan - ada segala macam opsi - Saya akan mengatur Kegagalan Pertama & Kedua untuk Memulai Kembali Layanan, Ketiga untuk menjalankan program batch yang mengeluarkan email BLAT dengan pemberitahuan kegagalan ketiga.

Anda juga harus mengatur Reset Gagal Hitung ke 1 untuk mengatur ulang jumlah gagal setiap hari.

SUNTING:

Sepertinya Anda dapat melakukan ini melalui baris perintah:

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

File MyBatchFile.CMD Anda dapat terlihat seperti ini:

blat - -body "Service W3svc Failed" -subject "SERVICE ERROR" -to [email protected] -server SMTP.Example.com -f [email protected]
Christopher_G_Lewis
sumber
3
Semua hal bagus, tetapi +1 terutama untuk saran pemberitahuan email dan hal-hal baris perintah.
Maximus Minimus
Di mana file batch harus hidup pada disk?
Matt
Di mana saja. Dengan SC failure w3svc command= "MyBatchFile.cmd"itu harus di jalur atau C: \ Windows \ System32. Anda dapat meletakkannya di direktori mana pun jika Anda menggunakan path lengkap yaituSC failure w3svc command= "c:\Stuff\MyBatchFile.cmd"
Christopher_G_Lewis
9

Buka Services.msc, klik dua kali pada layanan untuk membuka Properti layanan, ada tab Pemulihan dan pengaturan tersebut harus memungkinkan Anda untuk memulai kembali layanan setelah kegagalan.

jeremyasnyder
sumber
4

Cobalah untuk mengatur waktu pemulihan ke nol:

masukkan deskripsi gambar di sini

Setara baris perintah:

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

Bagaimanapun, kadang-kadang pemulihan otomatis tidak berfungsi dengan benar dan disarankan untuk menggunakan perangkat lunak pihak ketiga. Tampaknya ketika layanan keluar dengan anggun dengan kode keluar 0 windows tidak mencoba memulihkannya.

MSS
sumber
1

Saya menggunakan ServiceKeeper di server windows 2008 saya di HostForLife.eu dan bekerja sangat baik. Sebelumnya, saya pernah mengulas tentang ServiceHawk, tetapi saya lebih suka menggunakan ServiceKeeper untuk manajemen dan antarmuka yang lebih mudah.


sumber
1

Saya memiliki persyaratan yang sama untuk memulai layanan jika berhenti. Solusi paling sederhana yang saya pikir adalah menjalankan perintah di bawah ini di windows task scheduler setiap 5 menit:

mulai bersih MyServiceName

Perintah ini pada dasarnya akan memulai layanan (jika dihentikan) dan tidak berpengaruh jika layanan sudah berjalan.

Anderson
sumber
1

Saya baru-baru ini menerapkan opsi pemulihan untuk menjalankan skrip PowerShell yang mencoba untuk me-restart layanan beberapa kali dan mengirimkan pemberitahuan email pada kesimpulan, juga.

Setelah beberapa upaya (dan terlepas dari semua hal lain yang saya lihat) Konfigurasi bidang pada tab pemulihan dalam layanan adalah sebagai berikut:

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

Parameter baris perintah: -command "& {SomePath \ YourScript.ps1 '$ args [0]' '$ args [1]' '$ args [n]'}"

mis .: -command "& {C: \ PowershellScripts \ ServicesRecovery.ps1 'Nama Layanan'}"

** $ args adalah parameter yang akan diteruskan ke skrip Anda. Ini tidak wajib.

di sini adalah skrip 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
Nick
sumber
0

Ini jawaban saya di utas serupa. Semoga ini bisa membantu ...

Anda dapat menjadwalkan skrip vbs sederhana seperti ini untuk memulai ulang layanan pada komputer secara berkala jika diperlukan.

strComputer = "." 
strSvcName = "YOUR_SERVICE_NAME" 
set objWMI = GetObject ("winmgmts: \\" & strComputer & "\ root \ cimv2")
set objService = objWMI.Get ("Win32_Service.Name = '" & strSvcName & "'")
If objService.State = "Berhenti" Lalu
    objService.StartService ()
Berakhir jika


Maxwell
sumber
0

Seseorang mengajukan pertanyaan serupa di Super User: Anda dapat menginstal alat yang memantau layanan windows. Sesuatu seperti Service Hawk akan membantu Anda memulai layanan, atau memungkinkan Anda untuk menjadwalkan restart otomatis (mungkin pada malam hari) untuk menjaga layanan tetap berjalan lancar.


sumber