NSSM:将可执行文件注册为 Windows 服务
nssm 是一个免费、开源、轻量的 Windows 服务注册程序,可以将任何可执行文件注册为可靠的 Windows 服务, 虽然也有其他同类型的工具(比如微软官方的 srvany),但是远没有 nssm 简单易用
下载安装
官网下载压缩包: https://nssm.cc/download ,解压后能看到里面有 win32/win64,根据你系统位数选择

设置系统环境变量
便于使用,你可以将它加入到系统环境变量中:
打开系统属性-环境变量,将 win32/win64 目录添加到 Path 中,现在你就可以在任意位置使用 nssm 命令了
这不是必须的,你若不设置那就只能进入到 nssm.exe 所在目录去运行命令,后面使用命令行时会很难受
基本用法
服务注册
通过运行 nssm install <服务名> 唤出 GUI 配置面板,你可以在这个面板中轻松完成配置

注册一个最基础的服务仅需要配置 Application
- Path: 你的可执行程序
- Startup Directory: 启动目录,相当于 cmd 中先 cd 到此目录下再运行程序
- Arguments: 程序参数

完成后你就可以在 Windows 服务 中找到你刚刚注册的这个服务了
命令行式配置
你可以直接在命令行中操作,无需唤出配置面板 nssm install <servicename> <app> [<args> ...]
但是这只能注册一个最基础的服务,需要配置其他属性请看 服务配置
服务配置
nssm edit <servicename>: 唤出 GUI 配置面板
nssm dump <servicename>: 显示该服务的配置清单
nssm get <servicename> <parameter> [<subparameter>]: 查询某一项配置的当前值
nssm set <servicename> <parameter> [<subparameter>] <value>: 设置或修改配置项
nssm reset <servicename> <parameter> [<subparameter>]: 删除指定参数(或子参数),恢复默认值
服务删除
nssm remove [<servicename>]: 唤出 GUI 删除面板,需要手动点击确认删除
nssm remove <servicename> confirm: 在命令行直接删除,无确认动作
服务管理
nssm start <servicename>: 启动服务,相当于执行 Windows 服务的“启动”操作
nssm stop <servicename>: 停止服务,nssm 会按照配置项 Shutdown 中方式来退出进程,默认先尝试优雅退出(发送 Ctrl+C、WM_CLOSE、WM_QUIT 信号),等待超时将会强制终止进程
nssm restart <servicename>: 重启服务(停止并启动)
nssm status <servicename>: 查看服务当前状态
nssm rotate <servicename>: 触发日志轮转,仅当配置了 I/O 时生效
完整配置
Service name: 服务名称(只能使用英文字母、数字、下划线,不能有空格)
Application: 应用配置
- Path: 需要托管为服务的可执行程序路径
- Startup directory: 程序启动时的工作目录,相当于 cmd 中先执行 cd 到此目录 再运行程序。可避免程序在错误路径下读不到配置文件或资源
- Arguments: 启动时的命令行参数,如
-config config.yaml
Details: 服务详细信息
- Display name: 服务在 服务管理器 (services.msc) 中显示的名称,可含空格与中文
- Description: 服务的简要描述,显示在 服务属性 中
- Startup type: 服务启动方式
Automatic自动随系统启动Automatic (Delayed)延迟启动Manual手动启动Disabled禁用服务
Log on:
- Local System account: 使用本地系统帐户 (LocalSystem) 运行,权限高,但无法访问网络共享资源
- Allow service to interact with desktop: 允许服务显示窗口
- This account: 指定自定义用户(例如 .\Administrator 需要填写密码),适用于需要访问网络共享或域资源的程序
Dependencies: 列出启动前必须存在的其他服务,系统会按依赖顺序启动服务,若缺少依赖服务则启动失败
Process: 进程配置
- Priority: 程序运行优先级:
Real-time、High、Normal、Low,通常保持默认Normal - Affinity: 限制使用的 CPU 核心
- Console window: 是否显示控制台窗口,勾选后程序会弹出窗口,服务模式下通常不勾选
- Priority: 程序运行优先级:
Shutdown: 停止行为,定义当系统停止服务时,nssm 如何优雅关闭程序
- Generate Control-C: 向控制台程序发送
Ctrl+C信号,请求正常退出(类似 Ctrl+C 停止) - Send WM_CLOSE to windows: 向窗口程序(GUI)发送关闭消息,要求其自行退出
- Post WM_QUIT to threads: 向所有线程发送
WM_QUIT消息(少见,用于 GUI 程序) - Terminate process: 强制终止进程
- Generate Control-C: 向控制台程序发送
Exit actions: 退出行为,定义程序崩溃或退出时 nssm 的反应
- Throttling: 设置两次重启之间的最小时间间隔(毫秒),防止程序反复崩溃造成死循环
- Restart: 程序退出后的行为,一般要么重新运行,要么停止服务
Restart application默认项,程序退出后,nssm 会重新启动被托管的应用程序No action (srvany compatible)几乎不再使用(仅为兼容 srvany)Stop service (oneshot mode)单次运行模式,程序运行结束后服务自动停止Fake crash (pre-Vista)旧版系统兼容模式(Windows XP / 2003)
I/O: 配置程序的输入输出流
- Input(stdin): 从文件读取输入,一般留空
- Output(stdout): 程序的标准输出日志路径
- Error(stderr): 程序的错误输出日志路径
File rotation: 日志轮转,用于控制 nssm 自动轮转日志文件
- Replace existing Output and/or Error files: 若勾选,则每次启动服务时覆盖旧日志文件。若不勾选,则会追加
- Rotate files: 是否启用日志轮转,需要配置轮转机制
Environment: 为该服务单独设置环境变量,不影响系统环境
