記錄一下本週服務改造過程踩坑經歷。近期在作服務改造接入統一配置中心,對一些早期的服務進行升級,由此帶來了很多問題,好在都在測試環境解決了,平穩上線。html
代碼自動構建後,部署服務啓動失敗。到測試服務器上手動啓動服務報錯「錯誤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遠程調試沒有打開待刪除服務
這實際上是一個典型的研發,測試,運維合做解決問的過程。每一個公司的自動化運維構建平臺都會有各類不一樣的規定,例如配置更新問題。
部署的時候須要按照必定的步驟去檢查減小問題。
推薦使用SC命名行的方式操做安裝和卸載服務,能夠知足更多的需求而沒必要從新打包。例如安裝不一樣版本的同一個.exe服務,只是端口和服務名稱不同。
本文同步發表在公衆號文章 覆盤一次服務安裝失敗問題
- 博客是我學習過程的輸出,但願你有所收穫。
- 有想法請留言,共同探討學習。
- 因爲博主能力有限,文中可能存在描述不正確,歡迎指正、補充!
- 你也能夠關注個人公衆號:ProgramLife042,名稱:風之程序人生,方便接收最新內容。