俞木發(fā)
在正常情況下服務狀態(tài)只有“正在運行”和“已停止”兩種,但是服務處于啟動(或者重啟)過程,以及對服務發(fā)出停止/啟動指令時,就會顯示為“正在啟動”或“正在停止”狀態(tài)。如果服務可以正常響應,其狀態(tài)會在一段時間(一般3~5秒)后自動變?yōu)樯鲜龅恼顟B(tài)。但在一些異常的情況下,由于服務無法完成停止或啟動,就會處于掛起狀態(tài)(這個現(xiàn)象和內存不足時系統(tǒng)停止響應的狀態(tài)類似,下文稱之為掛起問題),此時右鍵菜單中的相應管理功能選項也會變?yōu)榛疑珶o法使用,服務其實是處于“假死”狀態(tài)(圖1)。
對于服務掛起處于“假死”狀態(tài)的情況,解決方法是將服務徹底停止后再啟動。這里我們根據(jù)不同的情況介紹相應的解決方案。
方法1:使用命令行強行終止
在發(fā)現(xiàn)服務處于掛起狀態(tài)時,可以打開任務管理器,找到服務對應的PID,如圖1所示的例子,該服務的PID為“2640”。接著使用管理員身份啟動命令提示符,輸入命令“taskkill /pid 2640 -t -f”并回車(每條命令的輸入后均需回車確認,下同),這樣可以將該服務終止。然后再次啟動該服務即可(圖2)。
如果不知道具體哪個服務被掛起,或者有少數(shù)服務被掛起,可以先打開圖1所示的窗口,點擊“狀態(tài)”排序,顯示為“正在啟動”或“正在停止”的均為被掛起的服務。然后在上述的窗口中繼續(xù)執(zhí)行命令“taskkill /F /FI"status eq not responding"”(參數(shù)/FI "status eq not responding",表示篩選服務狀態(tài)異常的進程),可以停止本機所有被掛起的服務(圖3)。
方法2:檢查依存服務導致掛起異常
上述的方法有時仍然無法解決問題,這是因為服務的依存關系導致的。服務的依存關系有兩類:一類是“此服務依賴以下的系統(tǒng)組件”,即該服務啟動需要先保證依賴的組件服務是處于正常啟動狀態(tài);另一類則是“以下系統(tǒng)組件依賴該服務”,即某些系統(tǒng)組件正常工作需要先保證該服務狀態(tài)是正常的,可以依次打開“服務屬性→依存關系”進行查看(圖4)。
“方法1”無法解決問題,原因就出在服務依賴的系統(tǒng)組件服務異常,比如“Windows Update”服務依賴RPC組件服務,如果RPC服務異常(如未啟動),無論如何停止/ 重啟“Wi n d ow sUpdate”服務仍會顯示異常。解決方法是先在任務管理器中找到異常的服務,同時根據(jù)窗口中“描述”欄的字符在服務管理窗口中找到對應的服務(圖5)。
接著按照圖4所示窗口找到“此服務依賴以下的系統(tǒng)組件”下顯示的服務,依次停止并重啟這里顯示的系統(tǒng)組件服務后再執(zhí)行“方法1”的操作即可。同樣的,執(zhí)行“方法1”的操作后,可能導致“以下系統(tǒng)組件依賴該服務”下的組件服務異常,解決的方法同上。
方法3:提權結束無法終止的服務
很多系統(tǒng)服務的運行賬戶是系統(tǒng)內置的SYSTEM,即使我們用管理員身份啟動命令提示符,在實際執(zhí)行taskkill命令時,系統(tǒng)也會提示沒有足夠的權限,比如很多安全軟件后臺駐留的服務(圖6)。對于這類服務,我們可以使用Psexec.exe和Process Explorer來獲取管理權限。
首先以管理員身份啟動命令提示符,輸入并執(zhí)行“d:\PSExec -s-i d:\ProcExp\ProcExp.exe”命令(假設Ps exe c .exe和ProcessExplorer均安裝在D : \),啟動Process Explorer后在進程列表中找到掛起的進程并雙擊打開,在打開的窗口中切換到“服務”,這里可以看到進程所對應的系統(tǒng)服務(圖7)。
接著按提示點擊“ 權限”,在打開的安全設置窗口的“組和用戶名”列表下選中“Administrators”,將其權限設置為“完全控制”(圖8)。最后依次點擊“確定”退出,這樣當前管理員就可以在任務管理器中或者使用taskkill命令管理這些服務了。