Computer >> Máy Tính >  >> Hệ thống >> máy chủ Windows

Giết một dịch vụ Windows gặp sự cố khi dừng hoặc khởi động

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

Giết một dịch vụ Windows gặp sự cố khi dừng hoặc khởi động

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

Windows Could not stop the xxxxxx service on Local Computer
Error 1053: The service did not respond in a timely fashion.
Thời gian chờ mà Trình quản lý kiểm soát dịch vụ chờ một dịch vụ bắt đầu hoặc dừng có thể được thay đổi bằng cách sử dụng ServicesPipeTimeout tham số đăng ký. Nếu dịch vụ không bắt đầu trong khoảng thời gian chờ đã 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 ). Bạn có thể tăng thời gian chờ 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 bắt đầu / 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 quy trình và đóng 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:

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

Giết một dịch vụ Windows gặp sự cố khi dừng hoặc khởi động

hoặc:

Windows could not stop the Service on Local Computer.
[SC] ControlService Error 1061: The service cannot accept control messages at this time.

Nội dung:

  • Làm thế nào để buộc loại bỏ một dịch vụ Windows bị mắc kẹt bằng TaskKill?
  • Buộc dừng một dịch vụ Windows bị mắc kẹt với PowerShell
  • Phân tích chuỗi chờ trên các dịch vụ của Hung bằng ResMon
  • Giết một dịch vụ Hung bằng cách sử dụng Process Explorer

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

Cách dễ nhất để dừng dịch vụ bị kẹt là sử dụng taskkill tích hợp sẵn công cụ dòng lệnh. Trước hết, bạn cần tìm PID (định danh quy trình) của dịch vụ. Ví dụ:hãy sử dụng 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 services.msc bảng điều khiển).

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 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 này rất quan trọng, nếu không sẽ xuất hiện lỗi bị từ chối truy cập):
sc queryex wuauserv
Trong trường hợp của chúng tôi, PID của dịch vụ wuauserv là 9186.
Để thực hiện quá trình bị mắc kẹt với PID 9186, hãy chạy lệnh:

taskkill /PID 9168 /F

Giết một dịch vụ Windows gặp sự cố khi dừng hoặc khởi động

SUCCESS: The process with PID 9168 has been terminated.

Lệnh này sẽ buộc kết thúc quá trình dịch vụ. Bây giờ bạn có thể bắt đầu dịch vụ với tên dịch vụ sc start servicename ra lệnh hoặc thông qua bảng điều khiển quản lý dịch vụ

Bạn có thể dừng một 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 quy trình dịch vụ. Công cụ taskkill có / 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ể hủy 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à tắt tất cả các dịch vụ ở trạng thái treo bằng lệnh:

taskkill /F /FI "status eq not responding"

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

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ị mắc kẹt với PowerShell

Bạn cũng có thể sử dụng PowerShell để buộc dừng dịch vụ. 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'}

Giết một dịch vụ Windows gặp sự cố khi dừng hoặc khởi động

Quy trình dừng lệnh ghép ngắn 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ị mắc 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"
}

Giết một dịch vụ Windows gặp sự cố khi dừng hoặc khởi động

Bạn phải sử dụng Get-CimInstance thay vì Get-WmiObject lệnh ghép ngắn trong PowerShell Core 6.x / 7.x mới. 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ụ Hung bằ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ổ Resource Monitor, hãy chuyển đến tab CPU và tìm quá trình dịch vụ bị treo;
  2. Chọn mục Phân tích chuỗi chờ từ menu ngữ cảnh; Giết một dịch vụ Windows gặp sự cố khi dừng hoặc khởi động
  3. Trong cửa sổ mới, bạn rất có thể sẽ thấy rằng quy trình của mình đang chờ quy trình khác. Kết thúc quá trình. Nếu bạn đang đợi 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ờ đợi cho quá trình này. Tìm PID của quá trình mà svchost.exe của bạn đang chờ đợi và loại bỏ nó.

Giết Hung thủ 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ố 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 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 đó hủy chúng. Để làm điều này, chúng tôi sẽ cần hai công cụ nhỏ: psexec.exe ProcessExplorer (có 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, hãy tìm quy trình dịch vụ bị mắc kẹt và mở các thuộc tính của nó;
  3. Đi tới Dịch vụ , tìm dịch vụ của bạn và nhấp vào Quyền khuy ao; Giết một dịch vụ Windows gặp sự cố khi dừng hoặc khởi động
  4. Cấp toàn quyền kiểm soát trong các quyền dịch vụ cho Quản trị viên nhóm . Lưu các thay đổi; Giết một dịch vụ Windows gặp sự cố khi dừng hoặc khởi động
  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 cho dịch vụ, hãy làm theo bài viết Đặt quyền trên dịch vụ Windows.