https://nssm.cc/ci/nssm-2.24-101-g897c7ad.zip
nssm官网下载地址
如果不能访问,网盘自取
下载通道:夸克盘
一、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 | ✅ 通用最稳 |
