Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

วิธี Kill บริการ Windows ที่ค้างที่สถานะ Stopping หรือ Starting

จะทำอย่างไรให้ Kill กระบวนการของบริการ Windows ที่ค้างอยู่ที่สถานะ “Stopping” หรือ “Starting”? ผู้ดูแลระบบ Windows หลายคนเคยเผชิญปัญหาเมื่อพยายามเริ่ม/หยุด/รีสตาร์ทบริการ แต่มันค้างอยู่กับสถานะ Stopping (หรือ Starting) คุณจะไม่สามารถหยุดบริการนี้จากคอนโซลการจัดการบริการ (services.msc) ได้ เนื่องจากปุ่มควบคุมทั้งหมดสำหรับบริการนี้จะกลายเป็น inactive (สีเทา) วิธีง่ายที่สุดคือรีสตาร์ท Windows แต่ไม่ได้เหมาะสมเสมอไป มาดูวิธีทางเลือกที่ช่วยให้ Kill บริการ Windows ที่ค้าง หรือกระบวนการได้อย่างบังคับโดยไม่ต้องรีบูทระบบ

วิธี Kill บริการ Windows ที่ค้างที่สถานะ Stopping หรือ Starting

หากภายใน 30 วินาทีหลังจากพยายามหยุดบริการ มันไม่หยุด Windows จะแสดงข้อความนี้:

Windows Could not stop the xxxxxx service on Local Computer Error 1053: The service did not respond in a timely fashion.

Timeout ที่ Service Control Manager รอให้บริการเริ่มหรือหยุด สามารถเปลี่ยนได้โดยใช้พารามิเตอร์รีจิสทรี ServicesPipeTimeout หากบริการไม่เริ่มภายใน timeout ที่ระบุ Windows จะส่งข้อผิดพลาดไปยัง Event Viewer (Event ID: 7000, 7009, 7011, a timeout was reached 30000 milliseconds) คุณสามารถเพิ่ม timeout นี้เป็น 60 วินาทีได้ ตัวอย่างเช่น:

reg add HKLM\SYSTEM\CurrentControlSet\Control /v ServicesPipeTimeout /t REG_SZ /d 600000 /f

สิ่งนี้มีประโยชน์เมื่อเริ่ม/หยุดบริการหนักที่ไม่มีเวลาเพียงพอในการยุติกระบวนการทั้งหมดและปิดไฟล์อย่างถูกต้อง (เช่น MS SQL Server)

หากคุณพยายามหยุดบริการเช่นนี้จาก command prompt: net stop wuauserv จะมีข้อความปรากฏ:

The service is starting or stopping. Please try again later.

วิธี Kill บริการ Windows ที่ค้างที่สถานะ Stopping หรือ Starting

หรือ:

Windows could not stop the Service on Local Computer. [SC] ControlService Error 1061: The service cannot accept control messages at this time.

محتويات:

  • วิธี Force Kill บริการ Windows ที่ค้างด้วย TaskKill
  • Force Stop บริการ Windows ที่ค้างด้วย PowerShell
  • การวิเคราะห์ Wait Chains บนบริการที่ค้างด้วย ResMon
  • การ Kill บริการที่ค้างด้วย Process Explorer

วิธี Force Kill บริการ Windows ที่ค้างด้วย TaskKill?

วิธีง่ายที่สุดในการหยุดบริการที่ค้างคือการใช้เครื่องมือบรรทัดคำสั่งในตัว taskkill ก่อนอื่น คุณต้องหา PID (Process Identifier) ของบริการ ดูตัวอย่างบริการ Windows Update ชื่อระบบคือ wuauserv (คุณสามารถตรวจสอบชื่อในคุณสมบัติบริการในคอนโซล services.msc)

บริการ Windows Modules Installer มักค้างเมื่อเซิร์ฟเวอร์รีสตาร์ท โดยเฉพาะหลังติดตั้งอัปเดตบน Windows Server 2012 R2 และ 2016 สำคัญ: โปรดระมัดระวัง การบังคับยุติบริการ Windows สำคัญอาจทำให้เกิด BSOD หรือการรีสตาร์ทระบบโดยไม่คาดคิด

รันคำสั่งนี้ใน command prompt ที่รันแบบ Administrator (สำคัญมาก ไม่งั้นจะเกิด error access denied):
sc queryex wuauserv
ในกรณีของเรา PID ของบริการ wuauserv คือ 9186
เพื่อ force kill กระบวนการที่ค้างกับ PID 9186 ให้รันคำสั่ง:

taskkill /PID 9168 /F

วิธี Kill บริการ Windows ที่ค้างที่สถานะ Stopping หรือ Starting

SUCCESS: The process with PID 9168 has been terminated.

คำสั่งนี้จะบังคับยุติกระบวนการของบริการ ตอนนี้คุณสามารถเริ่มบริการด้วยคำสั่ง sc start servicename หรือผ่านคอนโซลการจัดการบริการได้

คุณสามารถหยุดบริการที่ค้างได้อย่างสง่างามกว่านั้นโดยไม่ต้องตรวจสอบ PID ของกระบวนการบริการด้วยตนเอง เครื่องมือ taskkill มีตัวเลือก /FI ที่ช่วยให้คุณใช้ตัวกรองเพื่อเลือกบริการหรือกระบวนการที่ต้องการ คุณสามารถ kill บริการเฉพาะได้ด้วยคำสั่ง:

taskkill /F /FI "SERVICES eq wuauserv"

หรือคุณสามารถข้ามชื่อบริการไปเลยและ kill บริการทั้งหมดที่อยู่ในสถานะค้างด้วยคำสั่ง:

taskkill /F /FI "status eq not responding"

หลังจากนั้น บริการที่ค้างอยู่ในสถานะ Stopping ควรจะหยุดลง

คุณยังสามารถใช้ยูทิลิตี้ taskkill เพื่อ force stop บริการที่ค้างบนคอมพิวเตอร์ระยะไกลได้:

taskkill /S mun-fs01 /F /FI "SERVICES eq wuauserv"

Force Stop บริการ Windows ที่ค้างด้วย PowerShell

คุณยังสามารถใช้ PowerShell เพื่อบังคับให้บริการหยุดทำงานได้ โดยใช้คำสั่งต่อไปนี้ คุณสามารถได้รายการบริการในสถานะ Stopping:

Get-WmiObject -Class win32_service | Where-Object {$_.state -eq 'stop pending'}

หรือในสถานะ Starting:

Get-WmiObject -Class win32_service | Where-Object {$_.state -eq 'start pending'}

วิธี Kill บริการ Windows ที่ค้างที่สถานะ Stopping หรือ Starting

คอมมานด์เลต Stop-Process ช่วยให้สามารถยุติกระบวนการของบริการที่พบทั้งหมดได้ สคริปต์ PowerShell ต่อไปนี้จะยุติกระบวนการของบริการที่ค้างทั้งหมดบน Windows:

$Services = Get-WmiObject -Class win32_service -Filter "state = 'stop pending'"
if ($Services) {
foreach ($service in $Services) {
try {
Stop-Process -Id $service.processid -Force -PassThru -ErrorAction Stop
}
catch {
Write-Warning -Message "Error. Error details: $_.Exception.Message"
}
}
}
else {
Write-Output "No services with 'Stopping'.status"
}

วิธี Kill บริการ Windows ที่ค้างที่สถานะ Stopping หรือ Starting

คุณต้องใช้ Get-CimInstance แทนคอมมานด์เลต Get-WmiObject ใน PowerShell Core 6.x/7.x ใหม่ แทนที่คำสั่งแรกของสคริปต์ด้วย:

$Services = Get-CimInstance -Class win32_service | where-Object state -eq 'stop pending'

การวิเคราะห์ Wait Chains บนบริการที่ค้างด้วย ResMon

คุณสามารถตรวจจับกระบวนการที่ทำให้บริการค้างได้โดยใช้ resmon.exe (Resource Monitor)

  1. ในหน้าต่าง Resource Monitor ไปที่แท็บ CPU และหากระบวนการของบริการที่ค้าง
  2. เลือกรายการ Analyze Wait Chain จากเมนูบริบท;วิธี Kill บริการ Windows ที่ค้างที่สถานะ Stopping หรือ Starting
  3. ในหน้าต่างใหม่ คุณน่าจะเห็นว่ากระบวนการของคุณกำลังรออีกกระบวนการหนึ่ง ยุติกระบวนการนั้น หากคุณรอ svchost.exe หรือกระบวนการระบบอื่น คุณไม่จำเป็นต้องยุติมัน ลองวิเคราะห์ wait chain สำหรับกระบวนการนั้น หา PID ของกระบวนการที่ svchost.exe ของคุณกำลังรอ และ kill มัน

การ Kill บริการที่ค้างด้วย Process Explorer

แม้แต่ Local Administrator ก็ไม่สามารถยุติกระบวนการบางตัวที่รันภายใต้บัญชี SYSTEM ได้ เนื่องจากบัญชีแอดมินไม่มีสิทธิ์บนกระบวนการหรือบริการบางตัว ในการหยุดกระบวนการ (บริการ) แบบนี้ คุณต้องให้สิทธิ์กับบริการ (กระบวนการ) ให้กับกลุ่ม Administrators ท้องถิ่น จากนั้นจึง kill พวกมัน เราจะต้องใช้เครื่องมือเล็กๆ สองตัว: psexec.exe และ ProcessExplorer (ดาวน์โหลดได้จากเว็บไซต์ Microsoft)

  1. เพื่อเริ่ม ProcessExplorer ด้วยสิทธิ์ระบบ (runas SYSTEM) ใช้คำสั่ง: PSExec -s -i ProcExp.exe
  2. ในรายการกระบวนการของ Process Explorer หากระบวนการของบริการที่ค้างและเปิดคุณสมบัติของมัน
  3. ไปที่แท็บ Services หาบริการของคุณและคลิกปุ่ม Permissions;วิธี Kill บริการ Windows ที่ค้างที่สถานะ Stopping หรือ Starting
  4. ให้สิทธิ์ Full Control ในสิทธิ์ของบริการสำหรับกลุ่ม Administrators บันทึกการเปลี่ยนแปลง;วิธี Kill บริการ Windows ที่ค้างที่สถานะ Stopping หรือ Starting
  5. ตอนนี้ลองหยุดกระบวนการของบริการ โปรดทราบว่า สิทธิ์บนบริการจะถูกให้ชั่วคราวจนกว่าจะมีการรีสตาร์ท ในการให้สิทธิ์ถาวรบนบริการ โปรดดูบทความ Set permissions on a Windows service