复盘一次服务安装失败问题
目錄
- 前言
- 問(wèn)題描述
- 問(wèn)題分析
- 日志分析
- 重啟失敗服務(wù)
- 解決方案
- 總結(jié)
前言
記錄一下本周服務(wù)改造過(guò)程踩坑經(jīng)歷。近期在做服務(wù)改造接入統(tǒng)一配置中心,對(duì)一些早期的服務(wù)進(jìn)行升級(jí),由此帶來(lái)了不少問(wèn)題,好在都在測(cè)試環(huán)境解決了,平穩(wěn)上線。
問(wèn)題描述
代碼自動(dòng)構(gòu)建后,部署服務(wù)啟動(dòng)失敗。到測(cè)試服務(wù)器上手動(dòng)啟動(dòng)服務(wù)報(bào)錯(cuò)“錯(cuò)誤1053:服務(wù)沒有及時(shí)響應(yīng)啟動(dòng)或控制請(qǐng)求”,如圖:
修復(fù)問(wèn)題后服務(wù)無(wú)法重啟,希望能找到一個(gè)不重啟服務(wù)器的方法重新安裝啟動(dòng)服務(wù)。
問(wèn)題分析
基本套路還是一樣的,程序員的法寶:Debug和Log。
日志分析
分析的日志有三個(gè)方面可以參考:服務(wù)啟動(dòng)打印的日志,系統(tǒng)自帶的事件日志,命令行啟動(dòng)日志。 下面逐個(gè)分析使用場(chǎng)景和結(jié)論。
系統(tǒng)自帶日志
一般的程序錯(cuò)誤都會(huì)在系統(tǒng)日志里面留下痕跡,即使是程序崩潰了,只要系統(tǒng)沒有崩潰都會(huì)有記錄。
遺憾的是,本次應(yīng)用程序錯(cuò)誤后臺(tái)只有簡(jiǎn)單提示“服務(wù)沒有及時(shí)響應(yīng)啟動(dòng)或控制請(qǐng)求”。無(wú)法判斷是否環(huán)境問(wèn)題。
查看安裝日志,如圖,沒有找到太多有價(jià)值信息。
服務(wù)啟動(dòng)日志
如果能走到這步,后臺(tái)有程序輸出的記錄日志,一般都是啟動(dòng)服務(wù)進(jìn)入到程序里面才報(bào)錯(cuò)的,通過(guò)調(diào)試可以快速定位問(wèn)題。
查詢?nèi)罩局行?#xff0c;本次沒有生成新的日志,開啟調(diào)試開關(guān),本地也沒有生成記錄日志。可以判斷還沒有走到程序內(nèi)部。
命令行日志
如果是某個(gè)沒有捕捉到的問(wèn)題,直接拖到命令行啟動(dòng)倒是一個(gè)好方法,可以直接從控制臺(tái)看到某些錯(cuò)誤信息。
果然,通過(guò)這一步看到了錯(cuò)誤提示。詳細(xì)日志略過(guò)(敏感內(nèi)容就不貼了。。。),簡(jiǎn)單的說(shuō)就是配置沒有更新,某個(gè)依賴項(xiàng)服務(wù)沒有注冊(cè)導(dǎo)致服務(wù)dump。
進(jìn)一步使用SC命令可以查詢到其實(shí)服務(wù)是處于star-pending狀態(tài)。到此終于可以知道為何啟動(dòng)不起來(lái)了。
重啟失敗服務(wù)
接下來(lái)我們刪除這個(gè)啟動(dòng)失敗的服務(wù),有兩種處理方式:
InstallUtil.exe /u [FullPath\ServiceName.exe]SC delete [ServiceName]
我采用了第一種使用SC命名的方式,得到了如下的結(jié)果
然后安裝服務(wù),報(bào)1058的錯(cuò)誤。查看服務(wù)列表,這時(shí)候服務(wù)還是存在于列表中,只是狀態(tài)是禁用。
Google了一下,這種情況只需要重啟后繼續(xù)安裝就可以。問(wèn)題來(lái)了,服務(wù)器能隨便重啟嗎?不說(shuō)生產(chǎn)的服務(wù)器,就是測(cè)試的服務(wù)器上面也部署了各種服務(wù),幾百號(hào)人在開發(fā)測(cè)試呢。。。總不能等到下班后重啟服務(wù)器吧,找了一下,這種情況就只能刪除注冊(cè)表重新打開服務(wù)列表查看:
刪除注冊(cè)表項(xiàng)HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\你的服務(wù)名
找了一下卸載的原理,園子里這篇Windows API 之 Windows Service讓我了解到:
刪除服務(wù)的本質(zhì)是在注冊(cè)表里面刪除該服務(wù)的注冊(cè)表鍵以及該鍵的子鍵。
- 標(biāo)記該服務(wù)為可刪除的服務(wù)
- 檢查該服務(wù)是否已經(jīng)停止,并且該牽涉到該服務(wù)的所有句柄都已經(jīng)被關(guān)閉的時(shí)候,再來(lái)刪除該服務(wù);
- 如果該服務(wù)一直都在運(yùn)行狀態(tài),那么就等到下次機(jī)器重啟的時(shí)候,來(lái)刪除該服務(wù)
關(guān)鍵點(diǎn)在于:服務(wù)所有引用的句柄都已經(jīng)被關(guān)閉。
解決方案
修復(fù)造成程序啟動(dòng)失敗問(wèn)題
以下幾點(diǎn)可以在系統(tǒng)事件查看器看到錯(cuò)誤日志:
- 檢查安裝工具InstallUtil.exe版本是否一致
- 檢查配置文件startup的.NETFramework版本是否一致
- 如果添加服務(wù)使用了特別賬戶,檢查是否賦予了分組權(quán)限
以下幾點(diǎn)需要仔細(xì)check:
- 配置文件是否正確
- 依賴項(xiàng)是否全部打包正確
確認(rèn)待刪除服務(wù)沒有被占用
- 確保服務(wù)器只有你一個(gè)用戶在線操作待刪除服務(wù)
- 任務(wù)管理器工具(包括Process Explorer等)關(guān)閉對(duì)待刪除服務(wù)訪問(wèn)
- 服務(wù)控制臺(tái)和MMC均沒有打開待刪除服務(wù)
- 事件查看器沒有打開待刪除服務(wù)
- Visual Studio遠(yuǎn)程調(diào)試沒有打開待刪除服務(wù)
停止(stop)服務(wù),然后刪除(delete)服務(wù),最后重建(create)服務(wù)
總結(jié)
這其實(shí)是一個(gè)典型的研發(fā),測(cè)試,運(yùn)維合作解決問(wèn)的過(guò)程。每個(gè)公司的自動(dòng)化運(yùn)維構(gòu)建平臺(tái)都會(huì)有各種不同的規(guī)定,例如配置更新問(wèn)題。
部署的時(shí)候需要按照一定的流程,有一張checklist能減少問(wèn)題發(fā)生。
本文主要講了安裝服務(wù)失敗后卸載服務(wù)的處理方式,記錄下來(lái),希望對(duì)遇到相同問(wèn)題的人有一個(gè)參考。
推薦使用SC命名行的方式操作安裝和卸載服務(wù),可以滿足更多的需求而不必重新打包。例如安裝不同版本的同一個(gè).exe服務(wù),只是端口和服務(wù)名稱不一樣。
本文同步發(fā)表在公眾號(hào)文章 復(fù)盤一次服務(wù)安裝失敗問(wèn)題
轉(zhuǎn)載于:https://www.cnblogs.com/lijinfeng042/p/10296804.html
總結(jié)
以上是生活随笔為你收集整理的复盘一次服务安装失败问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我的世界作者是谁啊?
- 下一篇: 求冰上的尤里百度云资源谢谢!