复盘一次服务安装失败问题

目录

  • 前言
  • 问题描述
  • 问题分析
    • 日志分析
    • 重启失败服务
  • 解决方案
  • 总结

前言

记录一下本周服务改造过程踩坑经历。近期在做服务改造接入统一配置中心,对一些早期的服务进行升级,由此带来了不少问题,好在都在测试环境解决了,平稳上线。

问题描述

代码自动构建后,部署服务启动失败。到测试服务器上手动启动服务报错“错误1053:服务没有及时响应启动或控制请求”,如图:

修复问题后服务无法重启,希望能找到一个不重启服务器的方法重新安装启动服务。

问题分析

基本套路还是一样的,程序员的法宝:Debug和Log。

日志分析

分析的日志有三个方面可以参考:服务启动打印的日志,系统自带的事件日志,命令行启动日志。 下面逐个分析使用场景和结论。

系统自带日志

一般的程序错误都会在系统日志里面留下痕迹,即使是程序崩溃了,只要系统没有崩溃都会有记录。

遗憾的是,本次应用程序错误后台只有简单提示“服务没有及时响应启动或控制请求”。无法判断是否环境问题

查看安装日志,如图,没有找到太多有价值信息。

服务启动日志

如果能走到这步,后台有程序输出的记录日志,一般都是启动服务进入到程序里面才报错的,通过调试可以快速定位问题。

查询日志中心,本次没有生成新的日志,开启调试开关,本地也没有生成记录日志。可以判断还没有走到程序内部。

命令行日志

如果是某个没有捕捉到的问题,直接拖到命令行启动倒是一个好方法,可以直接从控制台看到某些错误信息。

果然,通过这一步看到了错误提示。详细日志略过(敏感内容就不贴了。。。),简单的说就是配置没有更新,某个依赖项服务没有注册导致服务dump。

进一步使用SC命令可以查询到其实服务是处于star-pending状态。到此终于可以知道为何启动不起来了。

重启失败服务

接下来我们删除这个启动失败的服务,有两种处理方式:

  1. InstallUtil.exe /u [FullPath\ServiceName.exe]
  2. SC delete [ServiceName]

我采用了第一种使用SC命名的方式,得到了如下的结果

然后安装服务,报1058的错误。查看服务列表,这时候服务还是存在于列表中,只是状态是禁用。

Google了一下,这种情况只需要重启后继续安装就可以。问题来了,服务器能随便重启吗?不说生产的服务器,就是测试的服务器上面也部署了各种服务,几百号人在开发测试呢。。。总不能等到下班后重启服务器吧,找了一下,这种情况就只能删除注册表重新打开服务列表查看:
删除注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\你的服务名

找了一下卸载的原理,园子里这篇Windows API 之 Windows Service让我了解到:
删除服务的本质是在注册表里面删除该服务的注册表键以及该键的子键。

  1. 标记该服务为可删除的服务
  2. 检查该服务是否已经停止,并且该牵涉到该服务的所有句柄都已经被关闭的时候,再来删除该服务;
  3. 如果该服务一直都在运行状态,那么就等到下次机器重启的时候,来删除该服务

关键点在于:服务所有引用的句柄都已经被关闭。

解决方案

  • 修复造成程序启动失败问题

    以下几点可以在系统事件查看器看到错误日志:

    1. 检查安装工具InstallUtil.exe版本是否一致
    2. 检查配置文件startup的.NETFramework版本是否一致
    3. 如果添加服务使用了特别账户,检查是否赋予了分组权限

以下几点需要仔细check:

  1. 配置文件是否正确
  2. 依赖项是否全部打包正确
  • 确认待删除服务没有被占用

    1. 确保服务器只有你一个用户在线操作待删除服务
    2. 任务管理器工具(包括Process Explorer等)关闭对待删除服务访问
    3. 服务控制台和MMC均没有打开待删除服务
    4. 事件查看器没有打开待删除服务
    5. Visual Studio远程调试没有打开待删除服务
  • 停止(stop)服务,然后删除(delete)服务,最后重建(create)服务

总结

这其实是一个典型的研发,测试,运维合作解决问的过程。每个公司的自动化运维构建平台都会有各种不同的规定,例如配置更新问题。

部署的时候需要按照一定的步骤去检查减少问题。

推荐使用SC命名行的方式操作安装和卸载服务,可以满足更多的需求而不必重新打包。例如安装不同版本的同一个.exe服务,只是端口和服务名称不一样。

本文同步发表在公众号文章 复盘一次服务安装失败问题

  1. 博客是我学习过程的输出,希望你有所收获。
  2. 有想法请留言,共同探讨学习。
  3. 由于博主能力有限,文中可能存在描述不正确,欢迎指正、补充!
  4. 你也可以关注我的公众号:ProgramLife042,名称:风之程序人生,方便接收最新内容。

原文地址:https://www.cnblogs.com/lijinfeng042/p/10296804.html

时间: 2024-11-05 00:42:18

复盘一次服务安装失败问题的相关文章

C#开发Windows Services服务--服务安装失败的解决办法

问题1:“System.Security.SecurityException:未找到源,但未能搜索某些或全部事件日志.不可访问的日志: Security.” 正在运行事务处理安装. 正在开始安装的“安装”阶段. 查看日志文件的内容以获得…\bin\Debug\Service2.exe程序集的进度. 该文件位于…\bin\Debug\Service2.InstallLog. 在“安装”阶段发生异常. System.Security.SecurityException:未找到源,但未能搜索某些或全部

网截服务安装和拦截修改数据

.版本 2.支持库 eNetIntercept .程序集变量 网劫, 网络服务安装 .子程序 __启动窗口_创建完毕 写到文件 (取运行目录 () + “\espi.dll”, #图片).如果真 (网劫.安装 (取运行目录 () + “\espi.dll”) = 假)信息框 (“网络服务安装失败”, 0, ).如果真结束网截1.打开 () '//对网截组件等进行服务的安装. '//将拦截的数据包替换为“当前修改的数据”. 网络数据.从字节集分配 (当前修改的数据) 返回 (2)

Windows服务安装与控制

Windows服务安装与控制 1.建立服务 (1)定义一个ServiceInstaller using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindowService { [System.ComponentModel.RunInstaller(true)] public class ServiceInstaller : System.Configurat

安装VisualSVN Server 报" Service 'VisualSVN Server' failed to start. " 服务启动失败

安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details"错误.原因是启动"VisualSVN Server"失败 2 咱们先来看一下这个服务在哪,计算机-右键-管理或者系统服务-在服务里面可以看到一个"VisualSVN Server"项,状

phpnow 在win7下遇到“安装服务[apache_pn]失败”问题的一种解决办法

安装PHPnow时如果遇到下列问题: 安装服务[apache_pn]失败.可能原因如下: 1. 服务名已存在,请卸载或使用不同的服务名. 2. 非管理员权限,不能操作 Windows NT 服务. 将PHPnow重新解压一份出来.例如解压到E盘的phpnow中. 一.在win7下遇到该问题,极有可能是权限不够.在开始“搜索文件和程序”中,输入cmd.然后右键点击cmd.exe,选择“以管理员身份运行”.然后进入到E盘phpnow目录下.直接执行setup.cmd 即可成功安装. 二.还有一种可能

升域的时候出现“安装Active Directory 域服务二进制文件失败”的解决办法

错误内容: 检测是否已安装Active Directory域服务二进制文件失败.错误是:请求的操作失败.需要重新启动系统才能回滚所做的更改. 解决方法 STEP1 进入服务器管理器,点击左下角的重新启动服务器. STEP2 控制面板-管理工具--服务--开启remote register服务. OK了,好不容易从搜到的,本来都要准备重装了.

《绝地求生大逃杀》BE错误怎么办 BE服务未正常运行及安装失败解决方法

<绝地求生大逃杀>BattlEye Launcher是游戏的反作弊程序,也是启动过程中做容易出现错误的,今天小编带来"爆锤吧务"分享的<绝地求生大逃杀>BE服务未正常运行及安装失败解决方法,有此烦恼的玩家赶紧来看吧. 在启动游戏之前切换成英文输入法,美式键盘. DLL文件的各种问题 dxgi.dll,d3d11.dll,uxtheme.dll,JiXunlsp641.4.dll,MSSPIREX64.DLL,NetDogDll64.dll等等. 以.dll结尾的

多学一点(十三)——解决Linux kdump服务启动失败

kdump 是 Linux Kernel 崩溃时的转储机制,简单理解就是在系统启动过程中如果 Kernel 因为某些原因崩溃了,kdump 就会负责记录日志以便排查原因.在 CentOS 6 等 Linux 发行版中,即便采用最小化安装, kdump 也会作为服务安装到系统中,此时可能因为我们对 Linux分配的内存的限制导致 kdump 服务开机启动失败,如图 1 所示: 图-1 kdump启动失败 解决 kdump 启动失败其实很简单,只要修改 grub.conf 文件,改变crashker

MySQL安装失败解决办法

一..msi版的MySQL安装包在最后执行的时候到第三步就死掉了,直接未响应 这是因为以前在本机中安装过MySQL,卸载的时候没有卸载干净导致的,因为有的文件夹隐藏的很深. 1.卸载MySql相关组件: 2.删除MySQL的安装目录: 3.在注册表(regedit)查询mysql,全部删除: cmd -> regedit 1.HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL 目录 2.HKEY_