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

news2026/4/27 20:37:50
个人主页杨利杰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 发起请求到服务进入 Running3.1 SCM 会先读取服务数据库3.2 SCM 会分析依赖关系3.3 SCM 发起启动并进入执行阶段3.4 服务进入 Running不是“SCM 猜的”而是服务自己上报的4. 状态变化为什么那么关键Start Pending 到 Running 背后到底意味着什么4.1 常见状态不是摆设而是启动过程的“里程碑”4.2 什么叫 Start Pending4.3 为什么有些服务会卡在 Start Pending4.4 Running 的真正含义是什么5. 服务一定会创建独立进程吗独立进程服务 vs 共享宿主服务到底怎么理解5.1 独立进程服务5.2 共享宿主服务5.3 为什么这对桌面支持很重要5.4 一个非常实用的查看方法查看服务列表查看某个服务更详细的信息查看 svchost 关联关系可辅助观察6. 服务启动失败怎么排这张图几乎可以直接当作桌面支持 SOP6.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 就一定是系统 Bug8.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 会先读取服务数据库SCMService 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这里面真正关键的点有两个服务不一定一定新建进程服务必须主动向 SCM 报状态3.4 服务进入 Running不是“SCM 猜的”而是服务自己上报的这一点非常重要。很多人误以为SCM 把服务进程拉起来就默认它是运行了。其实不是。SCM 需要服务端主动配合通过服务控制分发器、ServiceMain、状态上报接口去告诉 SCM我正在启动Start Pending我已经启动完成Running也就是说服务能不能真正变成 Running不只取决于“进程起来了没有”更取决于“服务有没有完成初始化并正确上报状态”。4. 状态变化为什么那么关键Start Pending 到 Running 背后到底意味着什么第三张图专门解释了状态变化链路非常适合拿来理解服务启动过程中最容易卡住的地方。4.1 常见状态不是摆设而是启动过程的“里程碑”当我们查看服务状态时常见的有StoppedStart PendingRunningStop PendingPaused在服务启动阶段最核心的就是Start PendingRunning4.2 什么叫 Start Pending当服务进程已经被拉起、服务初始化已经开始但还没完全准备好时服务会向 SCM 报告Start Pending这说明启动动作已经发起服务线程正在做初始化还没到最终可用状态也就是说Start Pending 不是失败它通常意味着“正在初始化中”。4.3 为什么有些服务会卡在 Start Pending这是现场非常常见的问题。因为在这一步服务通常还在做很多初始化工作比如读取配置建立 IPC 通信打开文件/注册表初始化网络连接访问数据库或远程资源注册控制处理函数只要其中某个环节卡住服务就可能长期停留在 Start Pending。所以在桌面支持现场“卡在 Pending”往往是排障突破口。4.4 Running 的真正含义是什么服务状态变成 Running说明至少满足了两个条件服务的初始化已经完成服务已经正确向 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-FilterNameSpooler|Select-ObjectName,DisplayName,State,StartMode,ProcessId,PathName查看 svchost 关联关系可辅助观察tasklist /svc这对分析某个服务到底挂在哪个进程里很有帮助。6. 服务启动失败怎么排这张图几乎可以直接当作桌面支持 SOP第五张图非常适合做实战排障思路总览6.1 推荐排障主线确认服务状态检查启动类型检查依赖服务查看事件日志检查服务账户和权限验证程序路径和文件完整性修复后重启复测这条主线非常适合一线桌面支持使用。6.2 第一步先看状态不要一上来就改配置先确认服务当前是StoppedStart PendingRunning启动失败直接报错可以用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 logon10.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.coloradmin.cn/o/2560601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…