当前位置: 首页 > news >正文

《Windows Internals》10.2.17 学习笔记:服务启动流程(Service start)——为什么“启动一个服务”看起来只是一瞬间,背后却是一整条从 SCM 到 Running 的完


🔥个人主页:杨利杰YJlio
❄️个人专栏:《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》
《微信助手》 《锤子助手》 《Python》 《Kali Linux》
《那些年未解决的Windows疑难杂症》
🌟让复杂的事情更简单,让重复的工作自动化


文章目录

  • 1. 《Windows Internals》10.2.17 学习笔记:服务启动流程(Service start)——为什么“启动一个服务”看起来只是一瞬间,背后却是一整条从 SCM 到 Running 的完整链路?
  • 2. 什么叫“服务启动流程”?它和“自动启动服务”有什么区别?
    • 2.1 两者的区别可以这样理解
    • 2.2 为什么这一节特别重要?
  • 3. 服务启动的主链路:从 SCM 发起请求,到服务进入 Running
    • 3.1 SCM 会先读取服务数据库
    • 3.2 SCM 会分析依赖关系
    • 3.3 SCM 发起启动并进入执行阶段
    • 3.4 服务进入 Running,不是“SCM 猜的”,而是服务自己上报的
  • 4. 状态变化为什么那么关键?Start Pending 到 Running 背后到底意味着什么?
    • 4.1 常见状态不是摆设,而是启动过程的“里程碑”
    • 4.2 什么叫 Start Pending?
    • 4.3 为什么有些服务会卡在 Start Pending?
    • 4.4 Running 的真正含义是什么?
  • 5. 服务一定会创建独立进程吗?独立进程服务 vs 共享宿主服务到底怎么理解?
    • 5.1 独立进程服务
    • 5.2 共享宿主服务
    • 5.3 为什么这对桌面支持很重要?
    • 5.4 一个非常实用的查看方法
      • 查看服务列表
      • 查看某个服务更详细的信息
      • 查看 svchost 关联关系(可辅助观察)
  • 6. 服务启动失败怎么排?这张图几乎可以直接当作桌面支持 SOP
    • 6.1 推荐排障主线
    • 6.2 第一步:先看状态,不要一上来就改配置
    • 6.3 第二步:看启动类型是否符合预期
    • 6.4 第三步:检查依赖项
    • 6.5 第四步:查看事件日志
    • 6.6 第五步:检查账户、权限和文件路径
    • 6.7 第六步:修复后必须重启复测
  • 7. 从桌面支持角度看,这一节到底能帮我们学到什么?
    • 7.1 你会更理解“服务启动失败”到底失败在哪
    • 7.2 你会更清楚该从哪一层下手排查
    • 7.3 它为后面几节内容打基础
  • 8. 学这一节最容易踩的几个误区
    • 8.1 误区一:服务启动 = 创建一个 EXE 进程
    • 8.2 误区二:进程在,就说明服务已经正常运行
    • 8.3 误区三:卡在 Start Pending 就一定是系统 Bug
    • 8.4 误区四:服务失败只看当前服务自己
  • 9. 总结提升:为什么说“服务启动流程”是真正理解 Windows 服务机制的关键节点?
    • 9.1 本文核心回顾
    • 9.2 对桌面支持最直接的价值
    • 9.3 下一篇预告

1. 《Windows Internals》10.2.17 学习笔记:服务启动流程(Service start)——为什么“启动一个服务”看起来只是一瞬间,背后却是一整条从 SCM 到 Running 的完整链路?

很多人平时在services.msc里右键一个服务,点一下“启动”,就会觉得服务启动这件事很简单:
无非就是把一个 EXE 拉起来,然后状态变成 Running。

但真正读到《Windows Internals》10.2.17 Service start这一节,你会发现事情远没有这么简单。

服务启动不是“点一下按钮立即完成”的动作,而是一条由 SCM 调度、服务进程创建、主线程初始化、ServiceMain 注册、状态上报,最终进入 Running 的完整链路。

这篇文章我会结合本节内容,把它拆成以下几个最关键的问题来讲清楚:

  • SCM 到底是怎么发起服务启动的?
  • 服务一定会创建新进程吗?
  • 为什么有的服务会卡在 Start Pending?
  • 独立进程服务和 svchost 共享宿主服务有何差异?
  • 桌面支持遇到“服务启动失败”时应该如何排障?

先看本节的整体流程图,建立一个全局印象。

从这张图你可以先记住一个核心结论:

服务启动不是一个点,而是一条链。


2. 什么叫“服务启动流程”?它和“自动启动服务”有什么区别?

在上一节10.2.16 自动启动服务里,我们关注的是:

  • 哪些服务会在系统启动过程中被挑出来
  • SCM 如何判断这些服务该不该启动
  • 自动 / 延迟自动 / 手动 / 禁用的区别

而这一节10.2.17 服务启动流程更进一步关注的是:

当 SCM 已经决定“要启动这个服务”之后,后面具体发生了什么。


2.1 两者的区别可以这样理解

  • 10.2.16 自动启动服务:回答“谁先启动、什么时候启动”
  • 10.2.17 服务启动流程:回答“真正开始启动后,是怎么一步步跑起来的”

也就是说:

10.2.16 解决的是“调度逻辑”,10.2.17 解决的是“执行链路”。


2.2 为什么这一节特别重要?

因为在桌面支持和系统排障里,我们经常会遇到这样的问题:

  • 服务状态一直卡在Starting / Start Pending
  • 点击启动后报错
  • 服务根本没进入 Running
  • 服务显示“已启动”,但实际功能不可用
  • 一个服务启动失败,导致另一个依赖服务也跟着失败

这些问题,单靠“我知道它是自动启动服务”是不够的。
你必须理解:

  • SCM 是如何控制服务启动
  • 服务进程是如何建立的
  • 服务线程如何接入控制分发器
  • 状态为什么会从 Start Pending 变成 Running

只有这样,你才能真正理解服务故障发生在哪一环。


3. 服务启动的主链路:从 SCM 发起请求,到服务进入 Running

先看第二张图,这张图讲的是SCM 判定和启动队列的思路,对理解启动上下文很有帮助。


3.1 SCM 会先读取服务数据库

SCM(Service Control Manager)并不会凭空知道某个服务怎么启动,它首先会读取服务配置,核心信息通常来自注册表中的服务数据库,例如:

HKLM\SYSTEM\CurrentControlSet\Services

这里面会记录:

  • 服务名
  • 映像路径
  • 启动类型
  • 依赖关系
  • 所属分组
  • 服务账户
  • 是否为共享宿主服务

所以从底层看,服务启动不是简单运行一个文件,而是先根据配置构造“启动计划”。


3.2 SCM 会分析依赖关系

SCM 在准备启动服务时,不会只看它自己,还会检查:

  • 它依赖哪些服务
  • 它所在的依赖链是否已经就绪
  • 是否有前置条件还没满足

例如某服务依赖 RPC、网络、证书服务,那么前面的依赖没有完成,它就不能直接进入 Running。

这也是为什么你在排障时,经常会发现:

真正坏掉的不是“当前服务”,而是它依赖的上游服务。


3.3 SCM 发起启动并进入执行阶段

当条件满足后,SCM 才会真正进入服务启动执行流程。
可以用下面这个 mermaid 图来理解:

SCM 接收启动请求

检查服务配置和依赖

创建服务进程 或 连接共享宿主进程

服务主线程初始化

调用 StartServiceCtrlDispatcher

进入 ServiceMain

向 SCM 上报 Start Pending

初始化完成

向 SCM 上报 Running

这里面真正关键的点有两个:

  1. 服务不一定一定新建进程
  2. 服务必须主动向 SCM 报状态

3.4 服务进入 Running,不是“SCM 猜的”,而是服务自己上报的

这一点非常重要。

很多人误以为:

SCM 把服务进程拉起来,就默认它是运行了。

其实不是。
SCM 需要服务端主动配合,通过服务控制分发器、ServiceMain、状态上报接口去告诉 SCM:

  • 我正在启动(Start Pending)
  • 我已经启动完成(Running)

也就是说,服务能不能真正变成 Running,不只取决于“进程起来了没有”,更取决于“服务有没有完成初始化并正确上报状态”。


4. 状态变化为什么那么关键?Start Pending 到 Running 背后到底意味着什么?

第三张图专门解释了状态变化链路,非常适合拿来理解服务启动过程中最容易卡住的地方。


4.1 常见状态不是摆设,而是启动过程的“里程碑”

当我们查看服务状态时,常见的有:

  • Stopped
  • Start Pending
  • Running
  • Stop Pending
  • Paused

在服务启动阶段,最核心的就是:

  • Start Pending
  • Running

4.2 什么叫 Start Pending?

当服务进程已经被拉起、服务初始化已经开始,但还没完全准备好时,服务会向 SCM 报告:

Start Pending

这说明:

  • 启动动作已经发起
  • 服务线程正在做初始化
  • 还没到最终可用状态

也就是说,Start Pending 不是失败,它通常意味着“正在初始化中”。


4.3 为什么有些服务会卡在 Start Pending?

这是现场非常常见的问题。

因为在这一步,服务通常还在做很多初始化工作,比如:

  • 读取配置
  • 建立 IPC 通信
  • 打开文件/注册表
  • 初始化网络连接
  • 访问数据库或远程资源
  • 注册控制处理函数

只要其中某个环节卡住,服务就可能长期停留在 Start Pending。

所以在桌面支持现场,“卡在 Pending”往往是排障突破口


4.4 Running 的真正含义是什么?

服务状态变成 Running,说明至少满足了两个条件:

  1. 服务的初始化已经完成
  2. 服务已经正确向 SCM 上报“我可以正常提供服务了”

这和“进程在不在”不是完全一回事。

有些进程虽然存在,但服务层面没有完成注册或初始化,也不一定能真正进入 Running。


5. 服务一定会创建独立进程吗?独立进程服务 vs 共享宿主服务到底怎么理解?

这部分是很多人第一次学服务机制时最容易混淆的地方。

第四张图正好把这个问题讲得很直观:


5.1 独立进程服务

独立进程服务比较好理解,它通常会:

  • 单独创建自己的进程
  • 这个进程只承载这个服务
  • 排障时更直观,观察也更清晰

它的优点:

  • 隔离性更强
  • 出问题时影响范围更小
  • 进程级定位更直接

它的缺点:

  • 相比共享宿主模式,资源占用可能更独立、更分散

5.2 共享宿主服务

共享宿主服务通常不会自己单独创建新进程,而是挂到某个宿主进程里运行,最典型的就是:

svchost.exe

这意味着:

  • 一个svchost.exe里可以承载多个服务
  • 服务启动时,可能只是被“装载”进现有宿主,或者通过服务组方式被统一拉起
  • 观察进程时不能只盯进程名,还要结合服务映射关系来看

5.3 为什么这对桌面支持很重要?

因为很多人排障时会犯一个典型错误:

只看到一个 svchost.exe,就以为是一个服务。

其实一个 svchost 里可能跑着多个服务。
所以当你看到某个共享宿主进程异常时,要进一步确认:

  • 这个 svchost 承载了哪些服务
  • 出问题的是整个宿主,还是其中某个服务
  • 该服务的分组、映射、账户、依赖关系是什么

服务排障不是只看“进程有没有”,还要看“服务和进程是怎样映射的”。


5.4 一个非常实用的查看方法

可以通过 PowerShell 或命令行快速观察服务信息。

查看服务列表

Get-Service|Sort-ObjectStatus,DisplayName

查看某个服务更详细的信息

Get-CimInstanceWin32_Service-Filter"Name='Spooler'"|Select-ObjectName,DisplayName,State,StartMode,ProcessId,PathName

查看 svchost 关联关系(可辅助观察)

tasklist /svc

这对分析某个服务到底挂在哪个进程里很有帮助。


6. 服务启动失败怎么排?这张图几乎可以直接当作桌面支持 SOP

第五张图非常适合做实战排障思路总览:


6.1 推荐排障主线

确认服务状态

检查启动类型

检查依赖服务

查看事件日志

检查服务账户和权限

验证程序路径和文件完整性

修复后重启复测

这条主线非常适合一线桌面支持使用。


6.2 第一步:先看状态,不要一上来就改配置

先确认服务当前是:

  • Stopped
  • Start Pending
  • Running
  • 启动失败直接报错

可以用:

sc query <服务名>

或者:

Get-Service-Name <服务名>

6.3 第二步:看启动类型是否符合预期

很多问题不是“启动不了”,而是配置被改了。

例如:

  • 原本应该自动,被改成手动
  • 原本正常,被改成禁用
  • 业务软件安装时写入了不合理配置

可用命令:

sc qc <服务名>

6.4 第三步:检查依赖项

这是服务故障里最容易被忽略,但又最关键的一步。

你要确认:

  • 当前服务依赖谁
  • 上游依赖是否运行
  • 上游依赖是否也有报错

很多服务启动失败,根因其实不在自己,而在依赖链。


6.5 第四步:查看事件日志

不要只盯着界面提示“无法启动”,一定要配合日志。

重点建议查看:

  • 事件查看器
  • 系统日志
  • 应用程序日志
  • 服务相关错误代码

你经常会在这里看到真正根因,例如:

  • 登录失败
  • 权限不足
  • 路径无效
  • 文件不存在
  • 超时
  • 依赖服务未启动

6.6 第五步:检查账户、权限和文件路径

服务启动链路里,不只是进程问题,账户和权限也非常关键。

需要重点确认:

  • 服务运行账户是否正确
  • 账户密码是否失效(适用于特定配置)
  • 可执行文件路径是否存在
  • 程序文件是否损坏
  • 是否被安全软件拦截

6.7 第六步:修复后必须重启复测

这一点很多人容易忽略。

因为服务问题有些是启动阶段问题,不重启可能复现不出来。
所以建议修复后至少验证:

  • 服务能否手动启动
  • 系统重启后能否正常自动启动
  • 用户侧功能是否恢复
  • 日志中是否还有持续报错

真正的闭环不是“我点启动成功了”,而是“服务在正常启动链路中能够稳定进入 Running”。


7. 从桌面支持角度看,这一节到底能帮我们学到什么?

很多人看 Windows Internals 会担心太底层,但实际上,10.2.17 服务启动流程对桌面支持是非常有价值的一节。


7.1 你会更理解“服务启动失败”到底失败在哪

以前可能只会说:

  • 服务没起来
  • 服务启动失败
  • 这个服务有问题

学完这一节后,你会更准确地描述成:

  • SCM 已经发起启动,但服务卡在 Start Pending
  • 服务进程已创建,但 ServiceMain 初始化未完成
  • 服务状态没有成功上报为 Running
  • 共享宿主进程正常,但其中某个服务初始化失败

这就是从“现象描述”升级到“链路判断”。


7.2 你会更清楚该从哪一层下手排查

以后遇到服务问题时,你不会只会做这三件事:

  • 重启服务
  • 重启电脑
  • 卸载重装软件

而是会更系统地去看:

  • 配置层
  • 依赖层
  • 账户层
  • 权限层
  • 日志层
  • 进程/宿主层

这就是 Windows Internals 带来的真正提升。


7.3 它为后面几节内容打基础

这一节其实是后续内容的重要铺垫,尤其是:

  • 10.2.18 服务登录(Service logon)
  • 10.2.19 延迟自动启动服务
  • 10.2.20 触发启动服务
  • 10.2.21 启动错误
  • 10.2.23 服务失败恢复

因为只有先理解“服务是怎么启动的”,你后面才更容易理解:

  • 为什么服务账户会影响启动
  • 为什么触发启动和自动启动不同
  • 为什么某些错误会发生在启动前、中、后不同阶段

8. 学这一节最容易踩的几个误区


8.1 误区一:服务启动 = 创建一个 EXE 进程

不准确。

有些服务是独立进程服务,有些则是共享宿主服务,可能运行在svchost.exe中。
所以“服务启动”不一定等于“新建一个独立进程”。


8.2 误区二:进程在,就说明服务已经正常运行

不一定。

进程存在,只能说明某个进程被拉起来了;
而服务要真正进入 Running,还需要:

  • 主线程初始化完成
  • 调用服务控制分发器
  • ServiceMain 处理完初始化
  • 正确向 SCM 上报状态

8.3 误区三:卡在 Start Pending 就一定是系统 Bug

不一定。

很多情况下,卡在 Start Pending 的原因可能是:

  • 初始化过程阻塞
  • 依赖项没准备好
  • 权限/账户问题
  • 程序本身逻辑异常
  • 外部资源连接失败

所以 Pending 更像是一个“问题暴露窗口”。


8.4 误区四:服务失败只看当前服务自己

这是最常见的误判。

很多时候根因来自:

  • 依赖服务失败
  • 共享宿主服务异常
  • 账户登录失败
  • 可执行路径错误
  • 权限变更

所以服务排障一定要看链路,不要只看单点。


9. 总结提升:为什么说“服务启动流程”是真正理解 Windows 服务机制的关键节点?

如果让我用一句话来总结《Windows Internals》10.2.17 服务启动流程(Service start),我会这样说:

它真正讲清楚的,不是“服务怎么被点起来”,而是 Windows 如何通过 SCM、服务进程、主线程初始化、ServiceMain 和状态上报机制,把一个服务从“准备启动”推进到“真正可用”。

这节内容带给我的最大收获,是把“服务启动”从一个模糊动作,变成了一条可以分阶段理解、分层排查的链路。


9.1 本文核心回顾

  • 服务启动不是一个点,而是一条链
  • SCM 是服务启动的调度中心
  • 服务不一定都会创建独立进程,也可能运行在共享宿主进程中
  • Start Pending 到 Running 代表的是初始化和状态上报过程
  • 桌面支持排障时,要从状态、配置、依赖、日志、账户、路径多维分析

9.2 对桌面支持最直接的价值

学完这一节后,我们面对“服务启动失败”“服务卡住”“svchost 异常”“服务状态不对”等问题时,不再只是停留在表面,而是能从启动流程链路去定位问题。

这也是我一直觉得Windows Internals 特别适合桌面支持人员深入学习的原因:
它不是只告诉你“怎么点”,而是告诉你Windows 为什么会这样工作


9.3 下一篇预告

下一篇我可以继续写:

《Windows Internals》10.2.18 服务登录(Service logon):为什么服务启动真正复杂的地方,不只是 CreateProcess,而是“账户登录、Token 构造、Profile 加载、Service SID 注入”这一整套接入链?》

如果你也在系统学习 Windows 服务机制,欢迎一起继续往下读。


🔝 返回顶部

点击回到顶部

http://www.cnnetsun.cn/news/2118780.html

相关文章:

  • 强化学习合成环境验证方法与工程实践
  • Windows电脑直接运行安卓应用:APK安装器终极指南
  • Python医疗AI落地生死线:为什么92%的影像模型在真实科室失败?(附FDA/CE双认证合规 checklist)
  • 终极指南:使用evernote-backup命令行工具轻松备份你的Evernote笔记
  • Cloudsplaining版本更新:从0.8.3看AWS IAM安全评估工具演进
  • 革命性安全参考OWASP Cheat Sheet Series:开发者的安全防护宝典
  • 华为交换机实战:用MSTP+VRRP+DHCP+Eth-Trunk+BFD搭建一个高可用企业网(附配置清单)
  • Mathsteps根式运算:掌握n次方根的简化与乘法
  • 【车规级TSN确定性通信终极方案】:基于C语言的gPTP+CBS+ATS三级协同调度,实测端到端抖动<125ns(附ASAM MCD-2MC兼容源码片段)
  • 3分钟解锁你的音乐宝藏:ncmdumpGUI让网易云NCM文件重获自由
  • 从零起步,掌握大模型只需这5本书!——大模型书籍推荐精选
  • net-speeder终极指南:如何在高延迟网络下实现2倍下载加速
  • TikTokDownload终极指南:3分钟掌握抖音去水印批量下载完整技巧
  • Venera:开启跨平台漫画阅读的数字艺术新纪元
  • SDXL潜在空间解析与图像生成控制技巧
  • Qianfan-OCR效果展示:同一张图开启/关闭布局分析的结构化差异对比
  • Python爬虫实战:手把手教你如何自动化采集全球陨石命名名录实战
  • git操作三- 解决冲突,删除文件,查看版本间更改了什么内容
  • 五一避坑:我整理了5个冷门景点,人少景美还不贵
  • 1 6.1 进入管理页面(账户 → 家庭 → 在线管理;Edge 打开)
  • 人生希望的具象化的庖丁解牛
  • 甜蜜点狙击:在亚马逊,如何找到“需求”与“独特性”的黄金交叉点
  • 如何在Blender中完美处理3MF格式:3D打印工作流的终极指南
  • 开源AI对话应用chatait-free部署指南:从架构解析到实战配置
  • 如何在PC上完美运行Switch游戏?Ryujinx模拟器深度解析与实战指南
  • RocketMQ面试题
  • 国有企业信息数据库
  • 瑞芯微(EASY EAI)RV1126B OTG切换成U盘模式
  • 2025届学术党必备的六大降AI率平台解析与推荐
  • 阅读APP书源配置终极指南:3分钟开启海量小说世界