กำจัดบริการ Windows ที่ติดค้างเมื่อหยุดหรือเริ่มทำงาน
วิธีฆ่ากระบวนการบริการ Windows ด้วยตนเองที่สแต็กที่ “
Stopping" หรือ "
Starting" สถานะ? ผู้ดูแลระบบ Windows ส่วนใหญ่ประสบปัญหาเมื่อพยายามเริ่ม/หยุด/เริ่มบริการใหม่ แต่ติดอยู่กับสถานะ หยุด (หรือ เริ่มต้น) คุณจะไม่สามารถหยุดบริการนี้จากคอนโซลการจัดการบริการ (
services.msc) เนื่องจากปุ่มควบคุมทั้งหมดสำหรับบริการนี้จะไม่ทำงาน (เป็นสีเทา) วิธีที่ง่ายที่สุดคือการรีสตาร์ท Windows แต่ก็ไม่เป็นที่ยอมรับเสมอไป มาดูวิธีอื่นๆ กัน ซึ่งช่วยให้สามารถฆ่าบริการหรือกระบวนการของ Windows ที่ติดอยู่ได้โดยไม่ต้องรีบูตระบบ
หากภายใน 30 วินาทีหลังจากพยายามหยุดบริการแต่ไม่หยุด Windows จะแสดงข้อความนี้:
Windows Could not stop the xxxxxx service on Local Computer
Error 1053: The service did not respond in a timely fashion.ระยะหมดเวลาที่ Service Control Manager รอให้บริการเริ่มหรือหยุดสามารถเปลี่ยนแปลงได้โดยใช้พารามิเตอร์รีจิสทรี ServicesPipeTimeout หากบริการไม่เริ่มทำงานภายในเวลาที่กำหนด Windows จะส่งข้อผิดพลาดไปยัง Event Viewer (รหัสเหตุการณ์: 7000, 7009, 7011, ระยะหมดเวลาถึง 30,000 มิลลิวินาที) คุณสามารถเพิ่มระยะหมดเวลานี้เป็น 60 วินาที ตัวอย่างเช่น:
reg add HKLM\SYSTEM\CurrentControlSet\Control /v ServicesPipeTimeout /t REG_SZ /d 600000 /fสิ่งนี้มีประโยชน์เมื่อเริ่ม/หยุดบริการขนาดใหญ่ที่มีเวลาไม่เพียงพอที่จะยุติกระบวนการทั้งหมดและปิดไฟล์อย่างเหมาะสม (เช่น MS SQL Server)
หากคุณพยายามหยุดบริการดังกล่าวจากพรอมต์คำสั่ง:
net stop wuauservข้อความจะปรากฏขึ้น:
The service is starting or stopping. Please try again later.หรือ :
Windows could not stop the Service on Local Computer.
[SC] ControlService Error 1061: The service cannot accept control messages at this time.จะบังคับให้ปิดบริการ Windows ที่ติดอยู่โดยใช้ TaskKill ได้อย่างไร
วิธีที่ง่ายที่สุดในการหยุดบริการค้างคือการใช้เครื่องมือบรรทัดคำสั่ง taskkill ในตัว ก่อนอื่น คุณต้องค้นหา PID (ตัวระบุกระบวนการ) ของบริการ ตัวอย่างเช่น ลองใช้บริการ Windows Update ชื่อระบบของมันคือ
wuauserv(สามารถตรวจสอบชื่อได้ในคุณสมบัติบริการใน
services.mscคอนโซล)
เป็นเรื่องปกติมากที่จะเห็นบริการ Windows Modules Installer ค้างเมื่อเซิร์ฟเวอร์รีสตาร์ท โดยเฉพาะหลังจากติดตั้งการอัปเดตบน Windows Server 2012 R2 และ 2016
สำคัญ เอาใจใส่ การบังคับยุติบริการ Windows ที่สำคัญอาจส่งผลให้เกิด BSOD หรือการรีสตาร์ทระบบโดยไม่คาดคิด
เรียกใช้คำสั่งนี้ในพรอมต์คำสั่งที่ยกระดับ (เป็นสิ่งสำคัญ ไม่เช่นนั้นข้อผิดพลาดการเข้าถึงถูกปฏิเสธจะปรากฏขึ้น):
sc queryex wuauservในกรณีของเรา PID ของบริการ wuauserv คือ 9186
หากต้องการบังคับฆ่ากระบวนการที่ติดขัดด้วย PID 9186 ให้รันคำสั่ง:
taskkill /PID 9168 /FSUCCESS: The process with PID 9168 has been terminated.คำสั่งนี้จะบังคับยุติกระบวนการบริการ ตอนนี้คุณสามารถเริ่มบริการด้วย
sc start servicenameคำสั่งหรือผ่านคอนโซลการจัดการบริการ
คุณสามารถหยุดบริการหยุดทำงานได้อย่างสง่างามมากขึ้นโดยไม่ต้องตรวจสอบ PID ของกระบวนการบริการด้วยตนเอง เครื่องมือ taskkill มีตัวเลือก /FI ซึ่งช่วยให้คุณใช้ตัวกรองเพื่อเลือกบริการหรือกระบวนการที่จำเป็น คุณสามารถฆ่าบริการเฉพาะได้ด้วยคำสั่ง:
taskkill /F /FI "SERVICES eq wuauserv"หรือคุณสามารถข้ามชื่อบริการไปเลยและฆ่าบริการทั้งหมดในสถานะหยุดทำงานด้วยคำสั่ง:
taskkill /F /FI "status eq not responding"หลังจากนั้นบริการที่อยู่ในสถานะหยุดทำงานควรหยุดลง
คุณยังสามารถใช้ยูทิลิตี taskkill เพื่อบังคับหยุดบริการแฮงค์บนคอมพิวเตอร์ระยะไกล:
taskkill /S mun-fs01 /F /FI "SERVICES eq wuauserv"บังคับให้หยุดบริการ Windows ที่ติดขัดด้วย PowerShell
คุณยังสามารถใช้ PowerShell เพื่อบังคับให้หยุดบริการได้ เมื่อใช้คำสั่งต่อไปนี้ คุณจะได้รับรายการบริการในสถานะหยุด:
Get-WmiObject -Class win32_service | Where-Object {$_.state -eq 'stop pending'}หรือในสถานะเริ่มต้น:
Get-WmiObject -Class win32_service | Where-Object {$_.state -eq 'start pending'}cmdlet 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"
}
คุณต้องใช้
Get-CimInstanceแทนที่จะเป็น
Get-WmiObjectcmdlet ใน PowerShell Core 6.x/7.x ใหม่ แทนที่คำสั่งแรกของสคริปต์ด้วย:
$Services = Get-CimInstance -Class win32_service | where-Object state -eq 'stop pending'การวิเคราะห์ Wait Chains บน Hung Services โดยใช้ ResMon
คุณสามารถตรวจหากระบวนการที่ทำให้บริการหยุดทำงานโดยใช้ resmon.exe (Resource Monitor)
ในหน้าต่าง Resource Monitor ให้ไปที่แท็บ CPU และค้นหากระบวนการบริการที่หยุดทำงาน
เลือกรายการ วิเคราะห์ห่วงโซ่การรอ จากเมนูบริบท
ในหน้าต่างใหม่ คุณมักจะเห็นว่ากระบวนการของคุณกำลังรอกระบวนการอื่น สิ้นสุดกระบวนการ หากคุณกำลังรอ svchost.exe หรือกระบวนการอื่นของระบบ คุณไม่จำเป็นต้องยกเลิก ลองวิเคราะห์ห่วงโซ่การรอสำหรับกระบวนการนี้ ค้นหา PID ของกระบวนการที่ svchost.exe กำลังรอและฆ่ามัน
การฆ่าบริการที่หยุดทำงานโดยใช้ Process Explorer
แม้แต่ผู้ดูแลระบบภายในก็ไม่สามารถยุติกระบวนการบางอย่างที่ทำงานภายใต้บัญชี SYSTEM ความจริงก็คือบัญชีผู้ดูแลระบบไม่ได้รับอนุญาตในกระบวนการหรือบริการบางอย่าง หากต้องการหยุดกระบวนการ (บริการ) ดังกล่าว คุณต้องให้สิทธิ์แก่บริการ (กระบวนการ) แก่กลุ่มผู้ดูแลระบบภายใน จากนั้นจึงหยุดการทำงาน ในการดำเนินการนี้ เราจำเป็นต้องมีเครื่องมือขนาดเล็กสองอย่าง: psexec.exe และ ProcessExplorer (มีอยู่ในเว็บไซต์ของ Microsoft)
ในการเริ่ม ProcessExplorer ด้วยสิทธิ์ระบบ (runas SYSTEM) ให้ใช้คำสั่ง:
PSExec -s -i ProcExp.exeในรายการกระบวนการ Process Explorer ให้ค้นหากระบวนการบริการที่ติดขัดและเปิดคุณสมบัติ
ไปที่แท็บ บริการ ค้นหาบริการของคุณ แล้วคลิกปุ่ม สิทธิ์
ให้สิทธิ์การควบคุมทั้งหมดในการอนุญาตบริการสำหรับกลุ่ม ผู้ดูแลระบบ บันทึกการเปลี่ยนแปลง
ตอนนี้พยายามหยุดกระบวนการบริการ
โปรดทราบว่าการอนุญาตในบริการจะได้รับเป็นการชั่วคราวจนกว่าจะเริ่มใหม่ หากต้องการให้สิทธิ์ถาวรในบริการ ให้ทำตามบทความ ตั้งค่าสิทธิ์ในบริการ Windows







