下面这份是 「NSSM = Windows 下跑 Java / Python / Node / 任意程序 的标准答案级教程」。
按 能直接上生产 的标准来讲,不是零碎命令,而是完整方法 + 场景 + 脚本 + 踩坑总结。
Spring Boot + JAR 后台运行,正是 NSSM 的最佳使用场景。
一、NSSM 是什么?一句话解释清楚
NSSM(Non-Sucking Service Manager)
👉 把 任何可执行程序 注册成 Windows 服务
✔ 开机自启
✔ 后台运行
✔ 自动重启
✔ 日志重定向
✔ 不依赖窗口 / 用户登录
二、什么时候必须用 NSSM?
| 场景 | 是否适合 |
|---|---|
| Spring Boot JAR 后台运行 | ✅ 必须 |
| Java 程序无人值守 | ✅ |
| Python 定时 / 常驻任务 | ✅ |
| Node.js 服务 | ✅ |
| EXE 后台运行 | ✅ |
| 需要开机自启 | ✅ |
| 只想临时跑脚本 | ❌ |
三、NSSM vs 其他方式对比(为什么选它)
| 方式 | 稳定 | 自启 | 自动重启 | 适合生产 |
|---|---|---|---|---|
| cmd 手动 java -jar | ❌ | ❌ | ❌ | ❌ |
| bat + start | ❌ | ❌ | ❌ | ❌ |
| 任务计划 | ⚠ | ⚠ | ❌ | ❌ |
| NSSM | ✅ | ✅ | ✅ | ⭐⭐⭐⭐⭐ |
四、NSSM 安装(只做一次)
1️⃣ 下载
2️⃣ 解压
例如:
D:\nssm\
└── win64\nssm.exe
3️⃣ 配置环境变量(推荐)
把:
D:\nssm\win64
加到 PATH
验证:
nssm version
五、最核心:用 NSSM 跑一个 Spring Boot JAR(完整)
🎯 场景:后台运行 Spring Boot + 自动重启
1️⃣ 基础准备
假设:
Java: D:\jdk-17
Jar : D:\oa\ParkOfficeSystem-0.0.1-SNAPSHOT.jar
端口: 9003
2️⃣ 安装服务(GUI 推荐)
nssm install ParkOfficeSystem
弹出窗口,按下面填写👇
Application 标签
| 字段 | 内容 |
|---|---|
| Path | D:\jdk-17\bin\java.exe |
| Arguments | -Xms512m -Xmx1024m -jar ParkOfficeSystem-0.0.1-SNAPSHOT.jar |
| Startup directory | D:\oa |
⚠ Startup directory 非常重要
Details 标签(强烈建议)
| 项 | 内容 |
|---|---|
| Display name | Park Office System |
| Description | OA System Spring Boot |
I/O 标签(日志)
| 项 | 路径 |
|---|---|
| Stdout | D:\oa\logs\stdout.log |
| Stderr | D:\oa\logs\stderr.log |
✔ 自动创建文件
✔ 防止日志丢失
Exit actions(自动重启)
| Exit code | Action |
|---|---|
| Default | Restart |
点击 Install service
3️⃣ 启动服务
nssm start ParkOfficeSystem
4️⃣ 查看状态
nssm status ParkOfficeSystem
5️⃣ 停止 / 重启
nssm stop ParkOfficeSystem
nssm restart ParkOfficeSystem
六、自动重启原理(为什么可靠)
- Java 崩溃 / OOM
- 程序 exit(1)
- 未捕获异常
👇
NSSM 监控进程
↓
检测退出
↓
自动重启
比你自己写 while(true) 强 10 倍
七、生产级 JVM 参数推荐(直接用)
-Xms512m
-Xmx1024m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\oa\logs\heapdump.hprof
-Dspring.profiles.active=prod
八、一键安装服务脚本(不会重复注册)
@echo off
set SERVICE_NAME=ParkOfficeSystem
set NSSM=nssm
set JAVA=D:\jdk-17\bin\java.exe
set APP_HOME=D:\oa
set JAR=ParkOfficeSystem-0.0.1-SNAPSHOT.jar
:: 判断服务是否存在
sc query "%SERVICE_NAME%" >nul 2>&1
if %errorlevel%==0 (
echo Service already exists.
goto start
)
echo Installing service...
%NSSM% install %SERVICE_NAME% "%JAVA%" ^
"-Xms512m -Xmx1024m -jar %JAR%"
%NSSM% set %SERVICE_NAME% AppDirectory "%APP_HOME%"
%NSSM% set %SERVICE_NAME% Start SERVICE_AUTO_START
%NSSM% set %SERVICE_NAME% AppExit Default Restart
:start
echo Starting service...
%NSSM% start %SERVICE_NAME%
pause
九、删除服务(你刚刚遇到的)
⚠ 必须管理员
nssm stop ParkOfficeSystem
nssm remove ParkOfficeSystem confirm
十、典型使用场景大全(你以后都能用)
| 程序 | 用法 |
|---|---|
| Spring Boot | java -jar |
| MyBatis 定时任务 | java -jar |
| Python | python app.py |
| Node | node index.js |
| FastAPI | uvicorn |
| 可执行 exe | 直接 path |
十一、90% 的坑我帮你提前踩完了
❌ 错误 1:jar 路径写错
👉 必须配 Startup directory
❌ 错误 2:服务名有空格
👉 用:
ParkOfficeSystem
❌ 错误 3:日志不重定向
👉 最终你只能抓瞎
❌ 错误 4:忘记管理员权限
👉 创建 / 删除必炸
十二、什么时候不该用 NSSM?
| 情况 | 建议 |
|---|---|
| Docker 环境 | Docker |
| Linux | systemd |
| 频繁部署 | CI + Docker |
十三、总结一句话
NSSM = Windows 上跑后端服务的“标准答案”