Cách thủ công kill tiến trình dịch vụ Windows bị kẹt ở trạng thái “Stopping” hoặc “Starting”? Hầu hết quản trị viên Windows đều từng gặp vấn đề khi họ cố gắng khởi động/dừng/khởi động lại dịch vụ, nhưng nó bị kẹt với trạng thái Stopping (hoặc Starting). Bạn sẽ không thể dừng dịch vụ này từ bảng điều khiển quản lý dịch vụ (services.msc), vì tất cả các nút điều khiển cho dịch vụ này trở nên không hoạt động (xám). Cách dễ nhất là khởi động lại Windows, nhưng không phải lúc nào cũng chấp nhận được. Hãy xem các cách thay thế, cho phép buộc kill dịch vụ hoặc tiến trình Windows bị kẹt mà không cần khởi động lại hệ thống.

Nếu trong vòng 30 giây sau khi cố gắng dừng dịch vụ, nó không dừng, Windows hiển thị thông báo này:
Windows Could not stop the xxxxxx service on Local Computer Error 1053: The service did not respond in a timely fashion.
Timeout mà Service Control Manager chờ dịch vụ khởi động hoặc dừng có thể thay đổi bằng tham số registry ServicesPipeTimeout. Nếu dịch vụ không khởi động trong timeout quy định, Windows gửi lỗi đến Event Viewer (Event ID: 7000, 7009, 7011, a timeout was reached 30000 milliseconds). Bạn có thể tăng timeout này lên 60 giây, ví dụ:
reg add HKLM\SYSTEM\CurrentControlSet\Control /v ServicesPipeTimeout /t REG_SZ /d 600000 /f
Điều này hữu ích khi khởi động/dừng các dịch vụ nặng không có đủ thời gian để kết thúc đúng cách tất cả các tiến trình và đóng file (ví dụ: MS SQL Server).
Nếu bạn cố gắng dừng dịch vụ như vậy từ command prompt: net stop wuauserv, một thông báo xuất hiện:
The service is starting or stopping. Please try again later.

hoặc:
Windows could not stop the Service on Local Computer. [SC] ControlService Error 1061: The service cannot accept control messages at this time.
Cách Force Kill dịch vụ Windows bị kẹt bằng TaskKill?
Cách dễ nhất để dừng dịch vụ bị kẹt là sử dụng công cụ dòng lệnh tích hợp sẵn taskkill. Trước hết, bạn cần tìm PID (process identifier) của dịch vụ. Lấy ví dụ dịch vụ Windows Update. Tên hệ thống của nó là wuauserv (bạn có thể kiểm tra tên trong thuộc tính dịch vụ trong console services.msc).
Rất thường thấy dịch vụ Windows Modules Installer bị treo khi máy chủ được khởi động lại, đặc biệt sau khi cài đặt cập nhật trên Windows Server 2012 R2 và 2016. Quan trọng. Hãy chú ý. Buộc chấm dứt các dịch vụ Windows quan trọng có thể dẫn đến BSOD hoặc khởi động lại hệ thống bất ngờ.
Chạy lệnh này trong command prompt với quyền cao (quan trọng, nếu không lỗi access denied sẽ xuất hiện):
sc queryex wuauserv
Trong trường hợp của chúng tôi, PID của dịch vụ wuauserv là 9186.
Để force kill tiến trình bị kẹt với PID 9186, chạy lệnh:
taskkill /PID 9168 /F

SUCCESS: The process with PID 9168 has been terminated.
Lệnh này sẽ buộc chấm dứt tiến trình dịch vụ. Bây giờ bạn có thể khởi động dịch vụ với lệnh sc start servicename hoặc qua bảng điều khiển quản lý dịch vụ.
Bạn có thể dừng dịch vụ bị treo một cách thanh lịch hơn mà không cần kiểm tra thủ công PID của tiến trình dịch vụ. Công cụ taskkill có tùy chọn /FI, cho phép bạn sử dụng bộ lọc để chọn dịch vụ hoặc tiến trình cần thiết. Bạn có thể kill một dịch vụ cụ thể bằng lệnh:
taskkill /F /FI "SERVICES eq wuauserv"
Hoặc bạn có thể bỏ qua tên dịch vụ hoàn toàn và kill tất cả dịch vụ ở trạng thái treo bằng lệnh:
taskkill /F /FI "status eq not responding"
Sau đó, dịch vụ bị kẹt ở trạng thái Stopping nên dừng lại.
Bạn cũng có thể sử dụng tiện ích taskkill để force stop dịch vụ treo trên máy tính từ xa:
taskkill /S mun-fs01 /F /FI "SERVICES eq wuauserv"
Force Stop dịch vụ Windows bị kẹt bằng PowerShell
Bạn cũng có thể sử dụng PowerShell để buộc dịch vụ dừng. Sử dụng lệnh sau, bạn có thể lấy danh sách dịch vụ ở trạng thái Stopping:
Get-WmiObject -Class win32_service | Where-Object {$_.state -eq 'stop pending'}
Hoặc ở trạng thái Starting:
Get-WmiObject -Class win32_service | Where-Object {$_.state -eq 'start pending'}

Cmdlet Stop-Process cho phép chấm dứt tiến trình của tất cả dịch vụ tìm thấy. Script PowerShell sau sẽ chấm dứt tất cả tiến trình dịch vụ bị kẹt trên 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"
}

Bạn phải sử dụng Get-CimInstance thay vì cmdlet Get-WmiObject trong PowerShell Core 6.x/7.x mới. Thay thế lệnh đầu tiên của script bằng:
$Services = Get-CimInstance -Class win32_service | where-Object state -eq 'stop pending'
Phân tích Wait Chains trên dịch vụ bị treo bằng ResMon
Bạn có thể phát hiện tiến trình gây ra dịch vụ bị treo bằng resmon.exe (Resource Monitor).
- Trong cửa sổ Resource Monitor, chuyển đến tab CPU và tìm tiến trình dịch vụ bị treo;
- Chọn mục Analyze Wait Chain từ menu ngữ cảnh;

- Trong cửa sổ mới, bạn sẽ thấy tiến trình của bạn đang chờ tiến trình khác. Kết thúc tiến trình đó. Nếu bạn đang chờ svchost.exe hoặc tiến trình hệ thống khác, bạn không cần chấm dứt nó. Hãy thử phân tích wait chain cho tiến trình này. Tìm PID của tiến trình mà svchost.exe của bạn đang chờ và kill nó.
Kill dịch vụ bị treo bằng Process Explorer
Ngay cả quản trị viên cục bộ cũng không thể chấm dứt một số tiến trình chạy dưới tài khoản SYSTEM. Thực tế là tài khoản admin đơn giản không có quyền trên một số tiến trình hoặc dịch vụ. Để dừng tiến trình (dịch vụ) như vậy, bạn cần cấp quyền cho dịch vụ (tiến trình) cho nhóm Administrators cục bộ và sau đó kill chúng. Để làm điều này, chúng ta sẽ cần hai công cụ nhỏ: psexec.exe và ProcessExplorer (có sẵn trên trang web Microsoft).
- Để khởi động ProcessExplorer với đặc quyền hệ thống (runas SYSTEM), sử dụng lệnh:
PSExec -s -i ProcExp.exe - Trong danh sách tiến trình Process Explorer, tìm tiến trình dịch vụ bị kẹt và mở thuộc tính của nó;
- Chuyển đến tab Services, tìm dịch vụ của bạn và nhấp nút Permissions;

- Cấp quyền Full Control trong quyền dịch vụ cho nhóm Administrators . Lưu thay đổi;

- Bây giờ thử dừng tiến trình dịch vụ. Lưu ý, quyền trên dịch vụ được cấp tạm thời cho đến khi nó được khởi động lại. Để cấp quyền vĩnh viễn trên dịch vụ, hãy làm theo bài viết Set permissions on a Windows service.