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

หากภายใน 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.

หรือ:
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

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'}

คอมมานด์เลต 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-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)
- ในหน้าต่าง Resource Monitor ไปที่แท็บ CPU และหากระบวนการของบริการที่ค้าง
- เลือกรายการ Analyze Wait Chain จากเมนูบริบท;

- ในหน้าต่างใหม่ คุณน่าจะเห็นว่ากระบวนการของคุณกำลังรออีกกระบวนการหนึ่ง ยุติกระบวนการนั้น หากคุณรอ svchost.exe หรือกระบวนการระบบอื่น คุณไม่จำเป็นต้องยุติมัน ลองวิเคราะห์ wait chain สำหรับกระบวนการนั้น หา PID ของกระบวนการที่ svchost.exe ของคุณกำลังรอ และ kill มัน
การ Kill บริการที่ค้างด้วย Process Explorer
แม้แต่ Local Administrator ก็ไม่สามารถยุติกระบวนการบางตัวที่รันภายใต้บัญชี SYSTEM ได้ เนื่องจากบัญชีแอดมินไม่มีสิทธิ์บนกระบวนการหรือบริการบางตัว ในการหยุดกระบวนการ (บริการ) แบบนี้ คุณต้องให้สิทธิ์กับบริการ (กระบวนการ) ให้กับกลุ่ม Administrators ท้องถิ่น จากนั้นจึง kill พวกมัน เราจะต้องใช้เครื่องมือเล็กๆ สองตัว: psexec.exe และ ProcessExplorer (ดาวน์โหลดได้จากเว็บไซต์ Microsoft)
- เพื่อเริ่ม ProcessExplorer ด้วยสิทธิ์ระบบ (runas SYSTEM) ใช้คำสั่ง:
PSExec -s -i ProcExp.exe - ในรายการกระบวนการของ Process Explorer หากระบวนการของบริการที่ค้างและเปิดคุณสมบัติของมัน
- ไปที่แท็บ Services หาบริการของคุณและคลิกปุ่ม Permissions;

- ให้สิทธิ์ Full Control ในสิทธิ์ของบริการสำหรับกลุ่ม Administrators บันทึกการเปลี่ยนแปลง;

- ตอนนี้ลองหยุดกระบวนการของบริการ โปรดทราบว่า สิทธิ์บนบริการจะถูกให้ชั่วคราวจนกว่าจะมีการรีสตาร์ท ในการให้สิทธิ์ถาวรบนบริการ โปรดดูบทความ Set permissions on a Windows service