1. NSSM到底是什么,为什么我们需要注册服务
提到Windows下的服务管理,很多人第一反应是“又不是不能用sc命令”,但真正折腾过的人都知道,原生sc create做出来的服务既不能方便地设置重启策略,也不能给程序配置环境变量和工作目录,更别提日志重定向这些实际部署里的刚需。NSSM,全称Non-Sucking Service Manager,翻译过来大概就是“不辣鸡的服务管理器”,它解决的问题非常直接:让你用一条命令甚至一个图形界面,把任意exe、bat、cmd、Python脚本、Node应用、Java进程注册成Windows服务,管理它的启动、停止、崩溃自动重启、日志输出,还能设置开机自启动。
我最早用NSSM是在帮同事部署一个内网工具的时候。那是一个Python写的定时任务,以前靠任务计划程序跑,但任务计划在系统重启后偶尔会丢状态,进程挂掉也不会自动拉起。换用NSSM注册成服务后,一条nssm install搞定,设置好Application、参数、日志路径,后面再没操心过。这篇文章就打算把这段时间积累的完整操作和经验写下来,从下载工具、图形化配置、命令行参数,到开机自启动的原理、常见坑的排查,一次讲清楚。
不管是运维、开发,还是自己电脑上要挂个常驻程序,这篇文章都能帮上忙。我尽量按“直接抄作业”的方式写,同时把关键步骤背后的原因也讲透,这样遇到新问题你也能自己判断。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动手前的准备:NSSM下载、版本选择与基本概念
2.1 下载哪些文件,版本怎么选
NSSM是免费开源的,官方地址是nssm.cc。进去以后下载页面会给一个zip包,里面按32位和64位分成了win32和win64两个文件夹。这里有个常见的坑:不是看系统是64位就一定用win64,你要看目标程序是32位还是64位。比如你有个老旧的32位exe要注册,用64位的NSSM也能管理,但官方推荐匹配程序位数,减少某些兼容性问题。一般情况下一律建议用win64,因为绝大多数现代程序都是64位了。
还有一个细节,NSSM有两个主要分支:2.x正式版和3.x开发版。2.24是目前最稳定的版本,网上搜到的中文教程基本都以它为准。3.x增加了环境变量导入、更细的日志控制等功能,但3.x是预发布版,商用或者生产环境我建议保守用2.24。下载zip后解压到比如D:\tools\nssm-2.24,把里面的nssm.exe拷到C:\Windows\System32也可以,但我不推荐直接扔系统目录,因为升级或卸载时不方便清理。更好的做法是放到一个固定目录,并把目录加到系统Path里,或直接在命令行里切换到该目录操作。
2.2 服务、进程、守护三个概念的辨析
在注册之前,最好把NSSM背后涉及的三个概念理清楚,很多配置选项看不懂就是这里糊涂。
- 服务(Service):Windows服务由服务控制管理器(SCM)统一管理,可以设置为开机自启动、依赖关系、恢复选项。服务一般以SYSTEM或指定账户运行,不依赖用户登录会话。
- 进程(Process):你写的exe、bat、Python脚本,本质上是一个被启动的进程。NSSM本质上是个“包装器”,它启动你的程序,然后持续监视。
- 守护(Daemon):NSSM充当守护进程,当你的程序崩溃或被关闭时,它会根据配置尝试重新拉起。这有点像Docker的restart policy,或者Linux里的systemd service。
NSSM把这三者结合:它先把自己注册为Windows服务,服务启动后,NSSM进程再创建你的目标程序进程,并等待它。如果目标进程退出,NSSM根据退出状态码决定是否重启以及等待多久。理解了这一层,你就能明白为什么NSSM可以很方便地实现“开机自启动”了——其实不是NSSM自己开机运行,而是Windows的SCM在开机时自动启动“服务”,服务启动后NSSM再拉起子进程,子进程就是你的程序。
2.3 图形界面还是命令行?看场景选择
NSSM提供了两种交互方式:一是直接运行nssm install弹出图形窗口,适合临时配置,能直接看到所有选项;二是纯用命令行参数,像nssm install 服务名 "程序路径" 参数,适合脚本批量部署。我个人的经验是:首次配置用图形界面熟悉选项,后期写成批处理或自动化脚本时全部用命令行,这样所有配置都能版本化管理。
另外要注意,NSSM的所有配置最终都写在注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\服务名。也就是说,如果你愿意,也可以直接改注册表,但不建议,NSSM已经做了很好的封装,没必要去碰底层。
3. NSSM注册服务的完整实操过程
3.1 基础注册命令:图形界面方式
我们拿一个常见的场景举例:给一个Java Spring Boot的jar包注册服务,方便开机自启动。假设java.exe位于C:\Program Files\Java\jdk17\bin\java.exe,jar包位于D:\app\myapp.jar。
第一步,打开命令行(管理员权限),切换到NSSM所在目录,或者使用绝对路径:
code复制D:\tools\nssm-2.24\win64\nssm.exe install MyApp
命令执行后立刻弹出图形窗口。这里面最关键的就几个字段:
- Application path:程序完整路径。填
C:\Program Files\Java\jdk17\bin\java.exe。注意,如果路径含空格,务必用引号,但窗口内直接填可执行文件路径,不需要引号,NSSM会自己处理。 - Startup directory:工作目录。这个必须填,比如填
D:\app。不填的话可能出现找不到相对路径的配置文件问题。 - Arguments:程序参数。对于jar包,填:
``
