ฉันจะเริ่มบริการ Windows ใหม่โดยอัตโนมัติได้อย่างไรถ้าขัดข้อง


57

ฉันมีบริการ Windows ที่ออกโดยไม่คาดคิดทุกสองสามวัน มีวิธีง่าย ๆ ในการตรวจสอบเพื่อให้แน่ใจว่าได้รับการเริ่มต้นใหม่อย่างรวดเร็วหากเกิดปัญหา

คำตอบ:


77

ภายใต้แอปพลิเคชันบริการเลือกคุณสมบัติของบริการที่เป็นปัญหา

ดูแท็บการกู้คืน - มีตัวเลือกทุกประเภท - ฉันได้ตั้งค่าความล้มเหลวที่หนึ่งและสองเพื่อเริ่มบริการใหม่อันดับที่สามเพื่อเรียกใช้โปรแกรมแบตช์ที่BLATส่งอีเมลพร้อมการแจ้งเตือนความล้มเหลวครั้งที่สาม

คุณควรตั้งค่ารีเซ็ตการนับล้มเหลวเป็น 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

3
ทุกสิ่งที่ดี แต่ +1 โดยเฉพาะอย่างยิ่งสำหรับคำแนะนำการแจ้งเตือนทางอีเมลและสิ่งที่บรรทัดคำสั่ง
Maximus Minimus

ไฟล์แบตช์ควรอยู่ที่ใดบนดิสก์
Matt

ทุกแห่ง ด้วยSC failure w3svc command= "MyBatchFile.cmd"มันควรจะอยู่ในเส้นทางหรือ C: \ Windows \ System32 คุณสามารถใส่ไว้ในไดเรกทอรีใดก็ได้หากคุณใช้เส้นทางแบบเต็มเช่นSC failure w3svc command= "c:\Stuff\MyBatchFile.cmd"
Christopher_G_Lewis

9

เปิด Services.msc คลิกสองครั้งที่บริการเพื่อเปิดคุณสมบัติของบริการมีแท็บการกู้คืนและการตั้งค่าเหล่านั้นจะช่วยให้คุณสามารถเริ่มบริการเมื่อความล้มเหลว


4

ลองตั้งเวลาการกู้คืนเป็นศูนย์:

ป้อนคำอธิบายรูปภาพที่นี่

เทียบเท่าบรรทัดคำสั่ง:

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

อย่างไรก็ตามบางครั้งการกู้คืนอัตโนมัติไม่ทำงานอย่างถูกต้องและแนะนำให้ใช้ซอฟต์แวร์บุคคลที่สาม ดูเหมือนว่าเมื่อบริการออกอย่างสง่างามพร้อมรหัสออกเป็น 0 windows จะไม่พยายามกู้คืน


1

ฉันใช้ServiceKeeperบนเซิร์ฟเวอร์ windows 2008 ของฉันที่ HostForLife.eu และใช้งานได้ดีมาก ก่อนหน้านี้ฉันมีรีวิวเกี่ยวกับ ServiceHawk แต่ฉันชอบใช้ ServiceKeeper เพื่อการจัดการและส่วนต่อประสานที่ง่ายขึ้น


1

ฉันมีข้อกำหนดที่คล้ายกันในการเริ่มบริการหากหยุดทำงาน ทางออกที่ง่ายที่สุดที่ฉันคิดคือการใช้คำสั่งด้านล่างในตัวกำหนดเวลางาน windows ทุก ๆ 5 นาที:

MyServiceName เริ่มต้นสุทธิ

คำสั่งนี้โดยทั่วไปจะเริ่มให้บริการ (ถ้าหยุดทำงาน) และจะไม่มีผลกระทบหากบริการกำลังทำงานอยู่


1

ฉันเพิ่งใช้ตัวเลือกการกู้คืนเพื่อเรียกใช้สคริปต์ 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 = "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

นี่คือคำตอบของฉันในหัวข้อที่คล้ายกันหวังว่านี้จะช่วย ...

คุณสามารถกำหนดตารางเวลาสคริปต์ vbs แบบง่าย ๆ เช่นนี้เพื่อเริ่มบริการเป็นระยะ ๆ บนคอมพิวเตอร์หากจำเป็น

strComputer = "." 
strSvcName = "YOUR_SERVICE_NAME" 
set objWMI = GetObject ("winmgmts: \\" & strComputer & "\ root \ cimv2")
ตั้งค่า objService = objWMI.Get ("Win32_Service.Name = '" & strSvcName & "'")
ถ้า objService.State = "หยุด" แล้ว
    objService.StartService ()
สิ้นสุดถ้า



0

มีคนถามคำถามที่คล้ายกันที่ Super User: คุณสามารถติดตั้งเครื่องมือที่ตรวจสอบบริการ windows บางอย่างเช่นService Hawkจะช่วยให้คุณเริ่มบริการหรือช่วยให้คุณสามารถกำหนดเวลาการรีสตาร์ทอัตโนมัติ (อาจเป็นช่วงกลางคืน) เพื่อให้บริการทำงานได้อย่างราบรื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.