Giết một dịch vụ Windows bị kẹt khi dừng hoặc bắt đầu

0
34
windows service stopping, starting, not responding

Làm thế nào để giết thủ công một quá trình dịch vụ Windows được xếp chồng ở Stopping trạng thái ” ” hoặc ” Starting “? Hầu hết các quản trị viên Windows đã phải đối mặt với một vấn đề khi họ cố gắng khởi động/dừng/khởi động lại một dịch vụ, nhưng nó bị kẹt với trạng thái Dừng (hoặc Bắtđầu). Bạn sẽ không thể dừng dịch vụ này khỏi 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 (chuyển sang màu 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 được chấp nhận. Chúng ta hãy xem xét các cách thay thế, cho phép buộc phải giết một dịch vụ hoặc quy trình Windows bị mắc kẹt mà không cần khởi động lại hệ thống.

windows service stopping, starting, not responding

Nếu trong vòng 30 giây sau khi cố gắng dừng dịch vụ, nó không dừng lại, Windows sẽ hiển thị thông báo này:

Windows không thể dừng dịch vụ xxxxxx lỗi máy tính
cục bộ 1053: dịch vụ không đáp ứng kịp thời.
Thời gian chờ mà trình quản lý điều khiển dịch vụ chờ dịch vụ khởi động hoặc dừng có thể được thay đổi bằng cách sử dụng tham số đăng ký ServicesPipeTimeout. Nếu dịch vụ không khởi động trong thời gian chờ được chỉ định, Windows sẽ gửi lỗi đến Trình xem sự kiện (ID sự kiện: 7000, 7009, 7011, thời gian chờ đã đạt tới 30000 mili giây). Ví dụ: bạn có thể tăng thời gian chờ này lên 60 giây:

reg add HKLMSYSTEMCurrentControlSetControl /v ServicesPipeTimeout /t REG_SZ /d 600000 /f

Điều này rất hữu ích khi khởi động/dừng các dịch vụ nặng không có đủ thời gian để chấm dứt tất cả các quy trình đúng cách và đóng các tệp (ví dụ: MS SQL Server).

Nếu bạn cố gắng dừng một dịch vụ như vậy từ dấu nhắc lệnh: net stop wuauserv , một thông báo xuất hiện:

Dịch vụ đang khởi động hoặc dừng. Vui lòng thử lại sau.

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

hoặc:

Windows không thể dừng Dịch vụ trên Máy tính Cục bộ.
[SC] ControlService lỗi 1061: dịch vụ không thể chấp nhận thông báo điều khiển tại thời điểm này.
nội dung:
  • Làm thế nào để buộc giết một dịch vụ Windows bị mắc kẹt bằng TaskKill?
  • Buộc dừng dịch vụ Windows bị kẹt với PowerShell
  • Phân tích chuỗi chờ trên dịch vụ Hưng sử dụng ResMon
  • Giết chết một dịch vụ treo bằng cách sử dụng Process Explorer

Làm thế nào để buộc giết một dịch vụ Windows bị mắc kẹt bằng TaskKill?

Cách dễ nhất để ngăn chặn một dịch vụ bị kẹt là sử dụng công cụ dòng lệnh taskkill tích hợp. Trước hết, bạn cần tìm PID (mã định danh quy trình) của dịch vụ. Ví dụ, hãy lấy dịch vụ Windows Update. Tên hệ thống của nó wuauserv là (bạn có thể kiểm tra tên trong các thuộc tính dịch vụ trong bảng điều services.msc khiển).

Nó là rất phổ biến để xem dịch vụ Windows Modules Installer treo khi máy chủ được khởi động lại, đặc biệt là sau khi cài đặt các bản 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 không mong muốn.

Chạy lệnh này trong dấu nhắc lệnh nâng cao (điều quan trọng hoặc truy cập bị từ chối lỗi 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.
Để buộc giết một quá trình bị kẹt với PID 9186, hãy chạy lệnh:

taskkill /PID 9168 /F

stopping stuck windows service in cmd using taskkill

THÀNH CÔNG: Quá trình với PID 9168 đã bị chấm dứt.

Lệnh này sẽ buộc chấm dứt quá trình dịch vụ. Bây giờ bạn có thể khởi động dịch vụ bằng lệnh sc start servicename hoặc thông qua bảng điều khiển quản lý dịch vụ

Bạn có thể dừng dịch vụ treo thanh lịch hơn mà không cần kiểm tra PID theo cách thủ công của quy 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 các dịch vụ hoặc quy trình cần thiết. Bạn có thể giết 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ụ và giết tất cả các dịch vụ ở trạng thái treo với lệnh:

taskkill /F /FI "status eq not responding"

Sau đó, dịch vụ được xếp chồng trong trạng thái dừng sẽ dừng lại.

Bạn cũng có thể sử dụng tiện ích taskkill để buộc dừng các dịch vụ treo trên máy tính từ xa:

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

Buộc dừng dịch vụ Windows bị kẹt với 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ể nhận được danh sách các dịch vụ ở trạng thái Dừng:

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

Hoặc ở trạng thái Bắt đầu:

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

list of services with "Stop pending" status

Lệnh ghép ngắn Stop-Process cho phép chấm dứt các quy trình của tất cả các dịch vụ được tìm thấy. Tập lệnh PowerShell sau sẽ chấm dứt tất cả các quy 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"
}

powershell script to kill stuck service process

Bạn phải sử dụng Get-CimInstance lệnh thay vì lệnh ghép ngắn trong Get-WmiObject PowerShell Core 6.x/7.x. Thay thế lệnh đầu tiên của tập lệnh bằng:

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

Phân tích chuỗi chờ trên dịch vụ Hưng sử dụng ResMon

Bạn có thể phát hiện quá trình khiến dịch vụ bị treo bằng cách sử dụng resmon.exe (Giám sát tài nguyên).

  1. Trong cửa sổ Giám sát tài nguyên, hãy chuyển đến tab CPU và tìm quy trình dịch vụ treo;
  2. Chọn mục Phân tích chuỗi chờ từ menu ngữ cảnh;Resource Monito analyze wait chain
  3. Trong cửa sổ mới, rất có thể bạn sẽ thấy rằng quy trình của bạn đang chờ đợi một quy trình khác. Kết thúc quá trình. Nếu bạn đang chờ quy trình svchost.exe hoặc một quy trình hệ thống khác, bạn không cần phải chấm dứt nó. Cố gắng phân tích chuỗi chờ cho quá trình này. Tìm PID của quá trình mà svchost của .exe đang chờ đợi và giết nó.

Giết chết một dịch vụ treo bằng cách sử dụ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ố quy trình chạy trong tài khoản HỆ THỐNG. Thực tế là tài khoản quản trị viên chỉ đơn giản là không có quyền đối với một số quy trình hoặc dịch vụ. Để dừng một quy trình (dịch vụ) như vậy, bạn cần cấp quyền cho dịch vụ (quy trình) cho nhóm Quản trị viên cục bộ và sau đó giết 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 của Microsoft).

  1. Để khởi động ProcessExplorer với các đặc quyền hệ thống (runas SYSTEM), hãy sử dụng lệnh: PSExec -s -i ProcExp.exe
  2. Trong danh sách quy trình Process Explorer, tìm quá trình dịch vụ bị kẹt và mở thuộc tính của nó;
  3. Chuyển đến tab Dịch vụ, tìm dịch vụ của bạn và bấm nút Quyền;proccess explorer service permissions
  4. Cấp toàn quyền kiểm soát ngay trong quyền dịch vụ cho nhóm quản trị viên. Lưu các thay đổi;granting full control permissions on windows service for admin
  5. Bây giờ hãy thử dừng quá trình dịch vụ.
    Xin lưu ý rằng 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 Đặt quyền trên dịch vụ Windows.

 

Dịch từ: http://woshub.com/killing-windows-services-that-hang-on-stopping/

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây