it-swarm-tr.com

Bir Windows hizmetini kilitlenmesi durumunda otomatik olarak nasıl yeniden başlatabilirim?

Birkaç günde bir beklenmedik şekilde açılan bir Windows hizmetim var. Çöküyorsa hızlı bir şekilde yeniden başlatıldığından emin olmak için izlemenin basit bir yolu var mı?

57
Liam

Hizmetler uygulaması altında, söz konusu hizmetin özelliklerini seçin.

Kurtarma sekmesini görüntüleyin - her türlü seçenek vardır - Birinci ve İkinci Hizmeti Yeniden Başlatma Başarısızlığı, Üçüncü olarak bir toplu program çalıştırmak için ayarladım BLAT Üçüncü hata bildirimi içeren bir e-posta çıktı.

Arıza sayısını günlük olarak sıfırlamak için Arıza Sayısı Sıfırla'yı 1 olarak ayarlamanız gerekir.

DÜZENLEME:

Bunu bir komut satırı üzerinden yapabileceğiniz anlaşılıyor:

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

MyBatchFile.CMD dosyanız aşağıdaki gibi görünebilir:

blat - -body "Service W3svc Failed" -subject "SERVICE ERROR" -to [email protected] -server SMTP.Example.com -f [email protected]
79

Services.msc dosyasını açın, hizmetin özelliklerini açmak için hizmeti çift tıklatın, bir Kurtarma sekmesi vardır ve bu ayarlar hata durumunda hizmeti yeniden başlatmanıza izin vermelidir.

9
jeremyasnyder

Kurtarma süresini sıfıra ayarlamaya çalışın:

enter image description here

Komut satırı eşdeğeri:

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

Her neyse, bazen otomatik kurtarma düzgün çalışmaz ve üçüncü taraf yazılımların kullanılması önerilir. Servis 0 pencerenin çıkış koduyla incelikle çıktığında kurtarmaya çalışmaz gibi görünüyor.

4
MSS

Ben durdu bir hizmet başlatmak için benzer bir gereklilik vardı. Düşündüğüm en basit çözüm, her 5 dakikada bir Windows görev zamanlayıcısında aşağıdaki komutu yürütmekti:

net start MyServiceName

Bu komut temel olarak hizmeti başlatır (durdurulmuşsa) ve hizmet zaten çalışıyorsa hiçbir etkisi yoktur.

1
Anderson

HostForLife.eu'daki Windows 2008 sunucumda ServiceKeeper kullanıyorum ve çok iyi çalışıyor. Daha önce ServiceHawk hakkında bir inceleme yaptım, ancak daha kolay yönetimi ve arayüzü için ServiceKeeper'ı kullanmayı tercih ediyorum.

1
Play_Park

Son zamanlarda, belirli bir sayıda hizmeti yeniden başlatmaya çalışan ve sonuçta bir e-posta bildirimi gönderen bir powershell betiği çalıştırmak için bir kurtarma seçeneği uyguladım.

Birkaç denemeden sonra (ve gördüğüm diğer tüm şeylere rağmen) Hizmetlerde kurtarma sekmesindeki alanların yapılandırılması aşağıdaki gibidir:

Program: Powershell.exe
** C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe değil

Komut satırı parametreleri: -command "& {SomePath\YourScript.ps1 '$ args [0]' '$ args [1]' '$ args [n]'}"

örneğin: -komut "& {C:\PowershellScripts\ServicesRecovery.ps1 'Hizmet Adı'}"

** $ args betiğinize geçirilecek parametrelerdir. Bunlar gerekli değildir.

powershell betiği:

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

Birisi Süper Kullanıcı'da benzer bir soru sordu: Windows hizmetlerini izleyen bir araç yükleyebilirsiniz. Service Hawk gibi bir şey, hizmetleri çalışmaya devam etmenize yardımcı olur veya hizmetin sorunsuz çalışmasını sağlamak için (muhtemelen gece) otomatik yeniden başlatmalar planlamanıza olanak tanır.

0
ExtraLean

Bu benim benzer bir iplik Bu yardımcı olur cevabım oldu ...

Gerekirse, bilgisayardaki hizmeti düzenli olarak yeniden başlatmak için böyle bir vbs komut dosyası zamanlayabilirsiniz.

 strComputer = "." 
 strSvcName = "YOUR_SERVICE_NAME" 
 set objWMI = GetObject ("winmgmts: \\" & strComputer & "\ root\cimv2") 
 set objService = objWMI.Get ("Win32_Service" .Name = '"& strSvcName &"' ") 
 ObjService.State =" Durduruldu "ise 
 ObjService.StartService () 
 Eğer Bitirse 


0
Maxwell