วิธีฆ่ากระบวนการบริการ 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 ระยะหมดเวลาถึง 30000 มิลลิวินาที ). คุณเพิ่มระยะหมดเวลานี้เป็น 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 ได้อย่างไร
- บังคับหยุดบริการ Windows ที่ค้างด้วย PowerShell
- วิเคราะห์การรอโซ่บนบริการ Hung โดยใช้ ResMon
- การฆ่าบริการที่หยุดทำงานโดยใช้ Process Explorer
จะบังคับฆ่าบริการ Windows ที่ค้างโดยใช้ TaskKill ได้อย่างไร
วิธีที่ง่ายที่สุดในการหยุดบริการที่ค้างอยู่คือการใช้ taskkill . ในตัว เครื่องมือบรรทัดคำสั่ง ก่อนอื่น คุณต้องหา PID (ตัวระบุกระบวนการ) ของบริการ ตัวอย่างเช่น มาใช้บริการ Windows Update ชื่อระบบคือ wuauserv
(คุณสามารถตรวจสอบชื่อในคุณสมบัติของบริการได้ใน services.msc
คอนโซล)
เรียกใช้คำสั่งนี้ในพรอมต์คำสั่งที่ยกระดับ (เป็นสิ่งสำคัญ มิฉะนั้น ข้อผิดพลาดในการปฏิเสธการเข้าถึงจะปรากฏขึ้น):sc queryex wuauserv
ในกรณีของเรา PID ของบริการ wuauserv คือ 9186
หากต้องการบังคับให้หยุดกระบวนการที่ค้างอยู่ด้วย PID 9186 ให้เรียกใช้คำสั่ง:
taskkill /PID 9168 /F
SUCCESS: 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 อนุญาตให้ยกเลิกกระบวนการของบริการที่พบทั้งหมด สคริปต์ 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-WmiObject
cmdlet ใน PowerShell Core 6.x/7.x ใหม่ แทนที่คำสั่งแรกของสคริปต์ด้วย:
$Services = Get-CimInstance -Class win32_service | where-Object state -eq 'stop pending'
วิเคราะห์การรอโซ่บน Hung Services โดยใช้ ResMon
คุณสามารถตรวจพบกระบวนการที่ทำให้บริการหยุดทำงานโดยใช้ resmon.exe (ตัวตรวจสอบทรัพยากร)
- ในหน้าต่างตัวตรวจสอบทรัพยากร ไปที่แท็บ CPU และค้นหากระบวนการบริการที่หยุดทำงาน
- เลือกรายการ วิเคราะห์การรอสาย จากเมนูบริบท
- ในหน้าต่างใหม่ คุณมักจะเห็นว่ากระบวนการของคุณกำลังรอกระบวนการอื่น สิ้นสุดกระบวนการ หากคุณกำลังรอ svchost.exe หรือกระบวนการอื่นๆ ของระบบ คุณไม่จำเป็นต้องยุติมัน ลองวิเคราะห์ห่วงโซ่การรอสำหรับกระบวนการนี้ ค้นหา PID ของกระบวนการที่ svchost.exe ของคุณกำลังรอและฆ่ามัน
การฆ่าบริการที่หยุดทำงานโดยใช้ Process Explorer
แม้แต่ผู้ดูแลระบบในพื้นที่ก็ไม่สามารถยุติกระบวนการบางอย่างที่ทำงานภายใต้บัญชี SYSTEM ได้ ความจริงก็คือบัญชีผู้ดูแลระบบไม่มีสิทธิ์ในกระบวนการหรือบริการบางอย่าง ในการหยุดกระบวนการดังกล่าว (บริการ) คุณต้องให้สิทธิ์แก่บริการ (กระบวนการ) แก่กลุ่มผู้ดูแลระบบในพื้นที่แล้วฆ่า ในการดำเนินการนี้ เราจะต้องมีเครื่องมือขนาดเล็กสองอย่าง:psexec.exe และ ProcessExplorer (มีอยู่ในเว็บไซต์ของ Microsoft)
- ในการเริ่ม ProcessExplorer ด้วยสิทธิ์ของระบบ (runas SYSTEM) ให้ใช้คำสั่ง:
PSExec -s -i ProcExp.exe
- ในรายการกระบวนการ Process Explorer ให้ค้นหากระบวนการบริการที่ค้างและเปิดคุณสมบัติ
- ไปที่ บริการ ค้นหาบริการของคุณแล้วคลิก การอนุญาต ปุ่ม;
- ให้สิทธิ์การควบคุมทั้งหมดในการอนุญาตบริการสำหรับ ผู้ดูแลระบบ กลุ่ม. บันทึกการเปลี่ยนแปลง;
- ตอนนี้ให้พยายามหยุดกระบวนการบริการ โปรดทราบว่าการอนุญาตในบริการจะได้รับชั่วคราวจนกว่าจะมีการเริ่มต้นใหม่ หากต้องการให้สิทธิ์อย่างถาวรในบริการ ให้ทำตามบทความ ตั้งค่าการอนุญาตบนบริการ Windows