[TOC] 前言 記錄一下本周服務改造過程踩坑經歷。近期在做服務改造接入統一配置中心,對一些早期的服務進行升級,由此帶來了不少問題,好在都在測試環境解決了,平穩上線。 問題描述 代碼自動構建後,部署服務啟動失敗。到測試伺服器上手動啟動服務報錯“錯誤1053:服務沒有及時響應啟動或控制請求”,如圖: ...
目錄
前言
記錄一下本周服務改造過程踩坑經歷。近期在做服務改造接入統一配置中心,對一些早期的服務進行升級,由此帶來了不少問題,好在都在測試環境解決了,平穩上線。
問題描述
代碼自動構建後,部署服務啟動失敗。到測試伺服器上手動啟動服務報錯“錯誤1053:服務沒有及時響應啟動或控制請求”,如圖:
修複問題後服務無法重啟,希望能找到一個不重啟伺服器的方法重新安裝啟動服務。
問題分析
基本套路還是一樣的,程式員的法寶:Debug和Log。
日誌分析
分析的日誌有三個方面可以參考:服務啟動列印的日誌,系統自帶的事件日誌,命令行啟動日誌。 下麵逐個分析使用場景和結論。
系統自帶日誌
一般的程式錯誤都會在系統日誌裡面留下痕跡,即使是程式崩潰了,只要系統沒有崩潰都會有記錄。
遺憾的是,本次應用程式錯誤後臺只有簡單提示“服務沒有及時響應啟動或控制請求”。無法判斷是否環境問題。
查看安裝日誌,如圖,沒有找到太多有價值信息。
服務啟動日誌
如果能走到這步,後臺有程式輸出的記錄日誌,一般都是啟動服務進入到程式裡面才報錯的,通過調試可以快速定位問題。
查詢日誌中心,本次沒有生成新的日誌,開啟調試開關,本地也沒有生成記錄日誌。可以判斷還沒有走到程式內部。
命令行日誌
如果是某個沒有捕捉到的問題,直接拖到命令行啟動倒是一個好方法,可以直接從控制台看到某些錯誤信息。
果然,通過這一步看到了錯誤提示。詳細日誌略過(敏感內容就不貼了。。。),簡單的說就是配置沒有更新,某個依賴項服務沒有註冊導致服務dump。
進一步使用SC命令可以查詢到其實服務是處於star-pending狀態。到此終於可以知道為何啟動不起來了。
重啟失敗服務
接下來我們刪除這個啟動失敗的服務,有兩種處理方式:
InstallUtil.exe /u [FullPath\ServiceName.exe]
SC delete [ServiceName]
我採用了第一種使用SC命名的方式,得到瞭如下的結果
然後安裝服務,報1058的錯誤。查看服務列表,這時候服務還是存在於列表中,只是狀態是禁用。
Google了一下,這種情況只需要重啟後繼續安裝就可以。問題來了,伺服器能隨便重啟嗎?不說生產的伺服器,就是測試的伺服器上面也部署了各種服務,幾百號人在開發測試呢。。。總不能等到下班後重啟伺服器吧,找了一下,這種情況就只能刪除註冊表重新打開服務列表查看:
刪除註冊表項HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\你的服務名
找了一下卸載的原理,園子里這篇Windows API 之 Windows Service讓我瞭解到:
刪除服務的本質是在註冊表裡面刪除該服務的註冊表鍵以及該鍵的子鍵。
- 標記該服務為可刪除的服務
- 檢查該服務是否已經停止,並且該牽涉到該服務的所有句柄都已經被關閉的時候,再來刪除該服務;
- 如果該服務一直都在運行狀態,那麼就等到下次機器重啟的時候,來刪除該服務
關鍵點在於:服務所有引用的句柄都已經被關閉。
解決方案
修複造成程式啟動失敗問題
以下幾點可以在系統事件查看器看到錯誤日誌:
- 檢查安裝工具InstallUtil.exe版本是否一致
- 檢查配置文件startup的.NETFramework版本是否一致
- 如果添加服務使用了特別賬戶,檢查是否賦予了分組許可權
以下幾點需要仔細check:
- 配置文件是否正確
- 依賴項是否全部打包正確
確認待刪除服務沒有被占用
- 確保伺服器只有你一個用戶線上操作待刪除服務
- 任務管理器工具(包括Process Explorer等)關閉對待刪除服務訪問
- 服務控制台和MMC均沒有打開待刪除服務
- 事件查看器沒有打開待刪除服務
- Visual Studio遠程調試沒有打開待刪除服務
停止(stop)服務,然後刪除(delete)服務,最後重建(create)服務
總結
這其實是一個典型的研發,測試,運維合作解決問的過程。每個公司的自動化運維構建平臺都會有各種不同的規定,例如配置更新問題。
部署的時候需要按照一定的流程,有一張checklist能減少問題發生。
本文主要講了安裝服務失敗後卸載服務的處理方式,記錄下來,希望對遇到相同問題的人有一個參考。
推薦使用SC命名行的方式操作安裝和卸載服務,可以滿足更多的需求而不必重新打包。例如安裝不同版本的同一個.exe服務,只是埠和服務名稱不一樣。
本文同步發表在公眾號文章 復盤一次服務安裝失敗問題
- 博客是我學習過程的輸出,希望你有所收穫。
- 有想法請留言,共同探討學習。
- 由於博主能力有限,文中可能存在描述不正確,歡迎指正、補充!
- 你也可以關註我的公眾號:ProgramLife042,名稱:風之程式人生,方便接收最新內容。