
Windows 基于 NSSM 2.24 实现 Bat/Java 应用系统服务托管、开机自启、故障自愈一、前言与业务背景、技术选型分析1.1 业务背景1.2 市面主流技术方案差异化对比1.3 最终选择 NSSM 的核心优势二、NSSM 工具官方简介2.1 官方定义2.2 版本选型说明三、NSSM 官方下载、校验、目录规范3.1 官方唯一下载地址3.2 安装包解压目录结构3.3 文件哈希安全校验防篡改、防植入3.4 生产标准化目录规划四、Bat 启动脚本4.1 脚本说明4.2 最终版脚本4.3 核心指令严谨解析4.4 多服务进程区分优化可选生产方案五、NSSM 图形化部署系统服务2.24 原版专属配置5.1 安装服务命令5.2 分标签精准配置适配 NSSM2.24 原版界面5.2.1 Application 标签核心路径配置5.2.2 I/O 标签日志托管配置5.2.3 Details 标签启动类型配置5.2.4 Log on 标签权限最小化生产安全核心5.3 服务创建成功标识六、服务基础运维命令七、生产安全加固方案7.1 目录权限加固适配 NetworkService 账户7.2 杀毒 / EDR 白名单配置八、NSSM 2.24 故障自愈策略配置8.1 版本限制严谨说明8.2 自愈策略配置命令精准有效、带注释8.3 配置校验命令验证参数生效8.4 关键现象解释九、功能测试方案9.1 故障自愈测试核心功能验证9.2 受控关停测试区分运维操作与故障十、生产踩坑总结与精准解决方案10.1 脚本环境类问题10.2 NSSM 版本兼容类问题10.3 目录权限类高频故障新测试问题补充10.5 进程重启逻辑现象误区十一、总结十二、附录常用命令速查表一、前言与业务背景、技术选型分析1.1 业务背景在 Windows Server 企业服务器运维场景中SpringBoot Java 应用、自定义批处理脚本等程序默认依赖桌面会话运行存在三大生产级短板普通 Bat 双击运行依附用户会话远程桌面断开、用户注销后程序直接终止无法后台常驻原生开机自启方式仅支持启动不具备进程监控、异常崩溃自动恢复能力业务中断无人自愈原生方案无标准化日志托管、权限管控生产环境可运维性、安全性不足。因此业务需要一套可后台常驻、开机自启、进程故障自愈、日志分离、权限最小化、稳定可靠的 Windows 服务托管方案。1.2 市面主流技术方案差异化对比Windows 平台将普通程序转为系统服务、实现常驻守护的主流方案共 5 类从原生性、故障自愈、日志能力、运维成本、合规性维度进行对比分析实现方案第三方依赖进程故障自愈标准系统服务日志托管能力运维难度适用场景Windows 任务计划程序无不支持否极弱低仅需简单开机自启无高可用需求srvanyinstsrv 微软原生工具系统自带工具需依赖系统恢复策略无进程级监控是弱高注册表配置繁琐涉密、信创、禁止开源工具场景自研 Bat/PowerShell 守护脚本无支持简易守护否自定义实现中高合规、零第三方依赖场景国产第三方进程守护工具国产第三方支持是一般低国产化替换项目NSSM 开源服务托管工具轻量开源原生进程级精准自愈是完善日志分离托管极低通用企业生产环境本文方案1.3 最终选择 NSSM 的核心优势综合生产稳定性、运维成本、功能完整性本文选用 NSSM 2.24 稳定版核心优势区别于其他方案对比 srvany自带进程实时监控可精准感知程序运行状态杜绝「服务显示运行、程序已崩溃」的虚假存活问题对比计划任务生成标准 Windows 系统服务支持权限管控、开机自启完全不依赖用户会话原生支持日志重定向标准输出、错误日志物理分离无需额外脚本处理日志支持细粒度进程退出码策略、重启延迟、崩溃限流可有效规避服务死循环重启问题图形界面 命令行双操作模式部署与运维门槛低适配企业标准化运维流程。二、NSSM 工具官方简介2.1 官方定义NSSM 全称为 Non-Sucking Service Manager是一款轻量、开源、免费的 Windows 服务辅助托管工具。官方网站https://nssm.cc结合官网原文翻译与功能解读核心特性如下传统 Windows 服务托管工具如 srvany存在缺陷无法监控应用进程状态易出现服务状态与实际运行状态不一致的问题NSSM 会实时监控托管进程应用异常退出、崩溃终止时可自动重启保证服务状态真实有效策略灵活对于稳定性较高的应用可关闭 NSSM 重启能力交由 Windows 系统原生恢复机制处理故障运行日志自动写入 Windows 系统事件日志可通过系统事件查看器排查启停、运行异常内置图形化服务安装、编辑、卸载界面2.19 及以上版本功能完善、稳定性大幅提升。2.2 版本选型说明本文生产环境选用 NSSM 2.24官方稳定版放弃预览版、最新版本。该版本在 Windows Server 全系列系统中兼容性最优、已知 BUG 最少也是企业运维领域使用最广泛的版本。三、NSSM 官方下载、校验、目录规范3.1 官方唯一下载地址官方下载页面https://nssm.cc/download3.2 安装包解压目录结构下载压缩包名称nssm-2.24.zip解压后目录结构固定如下src工具源码目录win3232 位 Windows 系统可执行程序目录win6464 位 Windows 系统可执行程序目录本文使用ChangeLog.txt版本更新日志文档README.txt官方使用说明文档 NSSM 解压后完整目录结构3.3 文件哈希安全校验防篡改、防植入生产环境使用前必须校验文件哈希值防止文件被篡改、植入恶意程序。NSSM 2.24 win64 原版 SHA256 哈希值f689ee9af94b00e9e3f0bb072b34caaf207f32dcb4f5782fc9ca351df9a06c97校验命令管理员 CMD 执行:: 切换至64位程序目录cd/d D:\softwares\nssm-server\nssm-2.24\win64 :: SHA256哈希校验 certutil-hashfilenssm.exe SHA256校验规则命令输出的哈希值与官方值完全一致则为原版安全文件若不一致立即删除文件并重新从官网下载。文件哈希校验执行结果溯源判定该哈希为官方原版有效值四大核验依据可自行复核官网源码打包溯源NSSM 2.24 正式版发布于2014-08-31官网Git仓库tag打包编译的win64架构nssm.exe固定生成该SHA256指纹官网下载包为同源编译产物。本文实操原生核验本文全程从 nssm.cc 官网直下2.24压缩包解压后管理员CMD本地核验原生输出上述哈希非手动伪造录入。版本区分避坑2017预览版2.24-101为另一组哈希本文选用稳定正式版2.24二者哈希不互通不可混用比对。核验逻辑只要官网原生编译文件哈希永久固定一旦被捆绑木马、修改代码、重编译哈希值会直接变更即可判定文件非原版。3.4 生产标准化目录规划统一固定路径禁止使用中文、空格、桌面临时目录便于后期运维迁移、权限管控D:\softwares\nssm-server # 总根目录D:\softwares\nssm-server\run-server #JDK、Jar包、启动脚本、日志根目录D:\softwares\nssm-server\nssm-2.24#NSSM主目录D:\softwares\nssm-server\nssm-2.24\win32 #NSSM32位程序目录D:\softwares\nssm-server\nssm-2.24\win64 #NSSM64位程序目录D:\softwares\nssm-server\run-server\logs # 应用日志目录需手动提前创建四、Bat 启动脚本4.1 脚本说明文件路径D:\softwares\nssm-server\run-server\runjava.bat作用加载 JDK 运行环境、配置 JVM 参数、启动 SpringBoot 项目适配 NSSM 后台托管不污染系统全局环境。4.2 最终版脚本echo off :: 关闭脚本冗余输出 :: 开启本地环境隔离 变量延迟扩展 setlocal enabledelayedexpansion :: 配置JVM运行参数服务端运行模式、统一字符编码setJAVA_OPTS^-server^-Dfile.encodingGBK ^-Dapp.nameOAuthApiService :: JDK绝对路径根据实际部署路径修改setJAVA_HOMED:\softwares\nssm-server\run-server\zulu17.50.19-ca-jdk17.0.11-win_x64 :: 追加JDK运行环境至系统变量保留原有Path不覆盖系统命令setPath%JAVA_HOME%\bin;%Path% :: JDK9及以上版本已废弃dt.jar、tools.jar删除冗余CLASSPATH配置规避报错 :: 切换到 jar 所在目录强制跨盘符cd/d D:\softwares\nssm-server\run-server :: 后台启动SpringBoot项目指定运行环境为 dev :: 多服务场景可替换为自定义进程名javaw-nssm.exe ::java%JAVA_OPTS%-jarproject-api.jar--spring.profiles.activedev :: 自定义服务名称javaw-nssm.exe javaw-nssm.exe %JAVA_OPTS%-jarproject-api.jar--spring.profiles.activedev4.3 核心指令严谨解析setlocal创建局部环境域脚本内定义的变量仅当前会话生效脚本执行结束后自动还原系统环境杜绝全局变量污染enabledelayedexpansion开启变量延迟解析兼容后续脚本迭代循环、嵌套逻辑属于生产环境通用规范写法cd /d支持跨盘符切换工作目录保证 Jar 包、配置文件正常读取移除CLASSPATHJDK 9 彻底废弃dt.jar、tools.jar该配置无效且易引发拼写错误生产环境直接删除。4.4 多服务进程区分优化可选生产方案单服务器部署多个 Java 服务时为区分进程、方便运维排查可以做如下优化进入 JDK 的bin目录复制原生javaw.exe重命名为javaw-nssm.exe修改脚本启动命令javaw-nssm.exe %JAVA_OPTS%-jarproject-api.jar--spring.profiles.activedev五、NSSM 图形化部署系统服务2.24 原版专属配置5.1 安装服务命令以管理员身份打开 CMD执行以下命令cd/d D:\softwares\nssm-server\nssm-2.24\win64 nssm.exeinstallOAuthApiService命令执行后自动弹出 NSSM 服务配置窗口。NSSM 服务编辑器主界面5.2 分标签精准配置适配 NSSM2.24 原版界面重要说明NSSM 2.24 无独立的 Log、Startup、Recovery 标签所有配置以当前界面为准。5.2.1 Application 标签核心路径配置PathD:\softwares\nssm-server\run-server\runjava.bat启动脚本完整路径Startup directoryD:\softwares\nssm-server\run-server脚本所在工作目录Application 标签路径配置5.2.2 I/O 标签日志托管配置NSSM 通过 I/O 标签实现标准输出、错误日志分离Output (stdout)D:\softwares\nssm-server\run-server\logs\stdout.log正常运行日志Error (stderr)D:\softwares\nssm-server\run-server\logs\stderr.log异常错误日志I/O 标签日志配置5.2.3 Details 标签启动类型配置常规业务服务选择Automatic系统开机自动启动依赖网络、数据库的服务选择Automatic (Delayed Start)系统启动完成后延迟启动Details 标签启动类型配置选中 Details 标签标注 Startup type 下拉选项。5.2.4 Log on 标签权限最小化生产安全核心安全原则禁止使用 LocalSystem、Administrator 等高权限账户遵循最小权限原则。推荐使用系统内置账户勾选This account用户名填写NT AUTHORITY\NetworkService密码输入框留空系统内置账户无密码。Log on 标签账户权限配置选中 Log on 标签标注账户选择项、用户名输入框。5.3 服务创建成功标识所有参数配置完成后点击窗口OK按钮。CMD 控制台输出以下内容代表服务创建成功ServiceOAuthApiServiceinstalled successfully!服务创建成功加入系统服务OAuthApiService六、服务基础运维命令所有服务操作命令均需在管理员 CMD中执行:: 启动系统服务 net start OAuthApiService :: 停止系统服务 net stop OAuthApiService :: 重启服务先停止再启动 net stop OAuthApiServicenet start OAuthApiService :: 打开 Windows 系统服务管理器图形化查看所有服务 services.msc :: 编辑已存在的 NSSM 服务配置重新打开图形配置窗口 nssm.exe edit OAuthApiService :: 卸载服务执行前必须先停止服务谨慎操作 nssm.exe remove OAuthApiService七、生产安全加固方案7.1 目录权限加固适配 NetworkService 账户服务以NetworkService账户运行需手动分配目录最小权限防止越权攻击右键目录D:\softwares\nssm-server\run-server→ 属性 → 安全 → 编辑点击「添加」搜索并选中用户NETWORK SERVICE权限配置允许「修改、读取 执行、列出文件夹内容、读取、写入」按需勾选「拒绝完全控制」应用范围选择此文件夹、子文件夹和文件。7.2 杀毒 / EDR 白名单配置NSSM 具备服务创建、进程托管能力会被主流杀毒软件、终端安全EDR标记为RiskTool风险工具属于正常误报需添加白名单白名单目录D:\softwares\nssm-server安全策略优化限制 NSSM 仅允许创建OAuthApiService单一服务拦截未知服务创建行为。八、NSSM 2.24 故障自愈策略配置8.1 版本限制严谨说明NSSM 2.24 无 Recovery 图形界面不支持AppResetFailCount、AppMaxFailures等参数所有自愈策略仅可通过命令行配置。8.2 自愈策略配置命令精准有效、带注释:: 切换至 NSSM64位程序目录cd/d D:\softwares\nssm-server\nssm-2.24\win64 :: 退出码-1进程被强制杀死 → 自动重启 nssm.exesetOAuthApiService AppExit-1Restart :: 退出码0程序正常退出 → 自动重启 nssm.exesetOAuthApiService AppExit0Restart :: 退出码1常规业务异常 → 自动重启 nssm.exesetOAuthApiService AppExit1Restart :: 退出码2严重运行异常 → 自动重启 nssm.exesetOAuthApiService AppExit2Restart :: 单独禁用某类异常的自动重启按需使用 nssm.exesetOAuthApiService AppExit1Ignore :: 重启延迟3000毫秒(3秒)预留端口、系统资源释放时间 nssm.exesetOAuthApiService AppRestartDelay3000:: 崩溃限流1500毫秒防止短时间内频繁崩溃导致死循环重启 nssm.exesetOAuthApiService AppThrottle15008.3 配置校验命令验证参数生效:: 查看各退出码对应的处理策略 nssm.exe get OAuthApiService AppExit-1nssm.exe get OAuthApiService AppExit0nssm.exe get OAuthApiService AppExit1nssm.exe get OAuthApiService AppExit2:: 查看重启延迟、崩溃限流配置 nssm.exe get OAuthApiService AppRestartDelay nssm.exe get OAuthApiService AppThrottle自愈策略配置命令执行验证8.4 关键现象解释执行nssm set AppExit xx Restart时若提示Reset parameter to its default该提示并非报错。NSSM2.24 默认所有退出码策略为Restart当配置值与默认值一致时会触发该提示策略实际已生效可通过get命令二次校验。补充Ignore关键字作用指定退出码触发时不执行自动重启用于区分人为运维关停和业务故障崩溃。九、功能测试方案前置校验自愈测试必做否则会出现重启失效执行故障自愈测试前必须完成目录权限校验进入项目根目录 D:\softwares\nssm-server\run-server右键文件夹 → 属性 → 安全 → 编辑确认用户 NETWORK SERVICE 已添加权限配置允许「修改 读取 执行、列出文件夹内容、读取、写入」若未添加该用户需手动新增并分配权限否则 NSSM 无法拉起新 Java 进程自愈功能完全失效。9.1 故障自愈测试核心功能验证管理员 CMD 执行tasklist | findstr javaw获取 Java 进程 PID执行taskkill /F /PID 对应PID强制终止运行进程等待 4 秒大于 3 秒重启延迟规避限流阈值干扰再次执行tasklist | findstr javaw观测结果输出全新 PID 的javaw-nssm.exe进程代表自愈策略生效。观测结果等待 3 秒后系统自动生成新的 Java 进程代表自愈策略生效。9.2 受控关停测试区分运维操作与故障执行命令net stop OAuthApiService服务正常停止且不会触发自动重启符合生产运维逻辑。进程杀死、自动重启完整测试流程CMD 依次执行查询进程、杀进程、再次查询进程的完整命令与输出展示 PID 变化。十、生产踩坑总结与精准解决方案10.1 脚本环境类问题问题CLASSPATH 变量大小写拼写错误导致应用启动异常原因脚本中%JAVA_HOMe%大小写不统一解决方案统一变量名%JAVA_HOME%JDK17 直接删除CLASSPATH冗余配置。问题Path 变量被覆盖系统基础命令失效原因原脚本直接覆盖系统 Path 变量解决方案改为追加模式set Path%JAVA_HOME%\bin;%Path%。问题启动后提示找不到 Jar 包原因NSSM 未配置Startup directory工作目录或路径包含中文 / 空格解决方案严格配置工作目录全路径使用纯英文、无空格字符。10.2 NSSM 版本兼容类问题问题执行 AppResetFailCount、AppMaxFailures 提示参数无效原因该类参数为高版本 NSSM 专属2.24 版本本身不支持解决方案放弃无效命令通过 Windows 服务「恢复」面板补充失败计数重置能力。问题AppExit Default 全局配置不生效原因NSSM 2.24 不支持Default通配符解决方案逐个配置具体退出码的处理策略。问题配置 Restart 提示重置为默认值原因配置值与软件默认策略一致属于正常提示非程序 BUG解决方案无需处理使用get命令校验配置即可。10.3 目录权限类高频故障新测试问题补充问题执行taskkill杀死 Java 进程等待 4 秒以上无新进程自动拉起手动双击runjava.bat可正常启动业务进程原因项目目录安全权限中未添加NETWORK SERVICE系统账户服务运行账户无读写、执行权限NSSM 尝试拉起进程时直接闪退复现特征本地脚本运行正常NSSM 托管下自愈重启完全失效解决方案① 右键D:\softwares\nssm-server\run-server→ 属性 → 安全 → 编辑 → 添加② 搜索并选中用户NETWORK SERVICE③ 分配权限允许读取 执行、列出文件夹内容、读取、写入④ 权限应用范围此文件夹、子文件夹和文件⑤ 重启服务后重新测试自愈功能。问题执行 taskkill 命令提示「拒绝访问」原因服务进程由系统账户运行普通用户权限不足解决方案使用管理员身份运行 CMD 执行操作。问题服务启动后无日志文件、无法写入日志原因NetworkService账户未分配目录读写权限解决方案按照本文权限配置章节完整配置文件夹安全权限。10.5 进程重启逻辑现象误区现象杀掉 Java 业务进程后服务面板仍显示「正在运行」短时间查询无进程延时后出现全新 PID 进程原理Windows 服务状态由 NSSM 宿主进程维护与 Java 子进程解耦配置AppRestartDelay延时重启延时结束后生成新进程PID 变化代表正常自愈。现象频繁短时间杀进程后永久不再自动重启 Java 进程原因短间隔重复崩溃触发AppThrottle限流保护解决方案重启服务重置限流计数器合理调大限流阈值测试时两次杀进程间隔大于限流毫秒数。十一、总结本文基于官方原版NSSM 2.24稳定版搭建Windows环境Java业务、Bat脚本标准化系统服务托管方案精准解决程序依附桌面会话、服务虚假运行、进程崩溃无自愈、业务日志无管控、运行账户权限过高五大生产运维痛点完整实现后台离线常驻、系统开机自启、进程级故障自愈、业务日志分离、账户最小权限运行核心能力。相较于Windows任务计划、srvany等传统托管方案本方案配置简单、运维门槛低、进程守护稳定性更强。十二、附录常用命令速查表使用前置要求全部命令需管理员身份CMD执行执行前需cd切换至nssm-win64目录功能场景执行命令生产运维备注文件 SHA256 哈希安全校验certutil -hashfile nssm.exe SHA256校验文件完整性防止恶意篡改安装系统服务nssm.exe install 服务名弹出可视化配置窗口交互式部署编辑已有服务配置nssm.exe edit 服务名修改脚本路径、日志、权限等参数卸载系统服务nssm.exe remove 服务名卸载前必须先停止服务严禁强制卸载启动系统服务net start 服务名触发NSSM自动拉起业务子进程停止系统服务net stop 服务名正常运维关停不会触发自动重启重启系统服务net stop 服务名 net start 服务名重载全部NSSM配置重置限流计数器打开系统服务管理器services.msc图形化查看启停状态、启动类型按名称筛选进程tasklist | findstr 进程名示例tasklist | findstr javaw-nssm强制终止指定PID进程taskkill /F /PID 进程ID仅测试自愈使用业务环境禁止随意执行查看NSSM服务配置参数nssm.exe get 服务名 配置项校验重启策略、延迟、限流参数是否生效修改NSSM服务配置参数nssm.exe set 服务名 配置项 值专属修改退出码、重启延时、限流规则