一、NSSM 是什么
NSSM(Non-Sucking Service Manager)是一个将普通 Windows 程序包装成标准 Windows 服务的工具。
核心用途是解决程序不是服务导致 Windows 服务管理器无法启动的问题。 版本 2.24 是目前最稳定、使用最广的生产版本。
二、NSSM 主要解决的问题
Windows 服务的硬性要求
Windows 原生服务必须调用 StartServiceCtrlDispatcher,实现 ServiceMain / Handler,并能被 SCM(Service Control Manager)管理。
以下程序通常无法满足上述要求:
| 程序类型 | 典型例子 |
|---|---|
| Java 程序 | java -jar xxx.jar |
| Python 程序 | python app.py |
| Node.js | node index.js |
| Go / C++ 普通 exe | 未按 Service API 编写 |
| 第三方中间件 | Redis、Nacos、MinIO(Windows 版) |
| 内部工具 | 自研采集器、Agent |
直接使用 sc create 或服务管理器启动这些程序通常会失败。
NSSM 的工作原理
Windows 服务 -> nssm.exe <- 真正注册成服务的程序 -> 你真正要跑的 exe / bat / cmd / java
NSSM 做了 5 件关键的事:
- 把自己注册成合法 Windows 服务
- 启动你的目标程序
- 监听进程状态
- 程序异常退出时自动重启
- 处理 stdin / stdout / 日志 / 信号
三、何时必须使用 NSSM(典型报错触发场景)
出现以下报错时,90% 的情况需要使用 NSSM:
❌ 报错 1:Error 1053(最常见)
Error 1053: The service did not respond to the start or control request in a timely fashion
原因:你注册的是普通程序,Windows 等不到 ServiceMain 回调。 解决方案:用 NSSM 包装该程序。
❌ 报错 2:Error 1067
The process terminated unexpectedly
原因:程序被当成服务启动,但立刻退出。 解决方案:NSSM + 自动重启策略。
❌ 报错 3:服务'启动后立即停止'
服务正在启动… 服务已停止
原因:程序是前台程序,SCM 认为它不合法。 解决方案:NSSM 托管进程生命周期。
❌ 报错 4:Java / Python 程序无法后台运行
java.exe 退出 python.exe 无日志
原因:没有控制台,stdin/stdout 丢失。 解决方案:NSSM 重定向日志。
❌ 报错 5:程序关不掉 / 关机卡死
Windows is shutting down…
原因:程序收不到 stop 信号。 解决方案:NSSM 发送 CTRL+C / WM_CLOSE。
四、NSSM 2.24 基本使用(实操)
4.1 下载与准备
- 文件:
nssm.exe - 推荐放置路径:
C:\nssm\nssm.exe - ⚠️ 一定用管理员权限执行命令
4.2 最简单的服务注册(GUI)
cd C:\nssm
nssm install MyService
会弹出 GUI 窗口:
Application 页面(最重要)
| 字段 | 填什么 |
|---|---|
| Path | 程序路径(exe / cmd / java.exe) |
| Arguments | 参数(如 -jar app.jar) |
| Startup directory | 程序工作目录 |
示例:Java 程序
Path: C:\Java\bin\java.exe
Arguments: -jar app.jar
Startup directory: D:\app
点击 Install service。
4.3 命令行方式(推荐生产)
nssm install MyService ^ "C:\Java\bin\java.exe" ^ "-jar app.jar"
设置工作目录:
nssm set MyService AppDirectory D:\app
五、非常重要的高级配置(强烈建议)
5.1 日志重定向(避免'啥也没有')
nssm set MyService AppStdout D:\logs\out.log
nssm set MyService AppStderr D:\logs\err.log
解决:
- 服务启动失败无日志
- 程序异常无输出
5.2 自动重启(生产必配)
nssm set MyService AppExit Default Restart
5.3 优雅停止(防数据损坏)
nssm set MyService AppStopMethodConsole 1500
nssm set MyService AppStopMethodWindow 1500
nssm set MyService AppStopMethodThreads 1500
六、常见 NSSM 相关报错与解决
❌ 报错:The system cannot find the file specified
原因:Path 写的是 java,没写绝对路径。
正确:C:\Java\bin\java.exe
❌ 报错:服务启动成功但程序没运行
原因:Startup directory 没设置,相对路径 jar 找不到。
解决:nssm set MyService AppDirectory D:\app
❌ 报错:中文路径程序无法启动
原因:程序不支持 Unicode,控制台编码问题。 解决:尽量避免中文路径,或用 cmd 包一层。
❌ 报错:服务删除后还在
sc delete MyService
或
nssm remove MyService confirm
七、NSSM vs 其他方式(对比结论)
| 方式 | 是否推荐 |
|---|---|
| sc create | ❌(只能服务程序) |
| srvany | ❌(已废弃) |
| WinSW | ⚠️(适合 .NET) |
| Task Scheduler | ❌(不可控) |
| nssm | ✅ 通用最稳 |


