一、简介
NSSM 是一个服务封装程序,它可以将普通 exe 程序 或 Java程序 或 Nodejs 项目封装成服务,像 windows 服务一样运行。同类型的工具还有微软自己的 srvany,不过 NSSM 更加简单易用,并且功能强大。它的特点如下:
- 支持普通 exe 程序(控制台程序或者带界面的 Windows 程序都可以)
- 安装简单,修改方便 可以重定向输出(并且支持 Rotation)
- 可以自动守护封装了的服务,程序挂掉了后可以自动重启
- 可以自定义环境变量
二、下载
下载主页:https://nssm.cc/download
直接下载:https://nssm.cc/release/nssm-2.24.zip
三、用法
不需要“安装” nssm。 只需将它放在系统上的某个位置(最好是 PATH 中的某个位置,例如c:\Windows目录下)并运行它。
但是请注意,nssm 将自己注册为事件日志消息源,这意味着从不同位置运行多个实例或不同版本的 nssm 可能会导致混淆。 另请注意,如果您运行事件查看器,它将打开 nssm 可执行文件,防止您覆盖它。 如果您要升级 nssm,请记住这一点。
某些功能被标记为从特定版本开始支持。 如果描述的版本比 下载 页面上提供的版本更新,则可能存在具有该功能的预发布 build 启用。
等效命令 下面的示例显示了 commands 将配置 现有 服务以匹配屏幕截图。 在许多情况下,它们代表相关参数的默认值,因此是多余的。 任何参数也可以重置为默认值
nssm reset <servicename> <parameter>
安装一个服务
您可以使用 nssm 来安装服务。 键入的命令是:
nssm install <servicename>
安装程序由几个带有许多可配置参数的选项卡组成。 大多数都预设为 nssm 的默认值,因此可以在不离开 Application 选项卡的情况下安装服务。
Application tab(应用程序选项卡)
您要运行的应用程序(或脚本)的 Path 是唯一的必填字段。 如果应用程序需要在特定目录中启动,您可以在 Startup directory 字段中输入它。 如果该字段留空,则默认启动目录将是包含应用程序的目录。 Arguments 字段可用于指定要传递给应用程序的任何命令行参数。
下面的屏幕截图显示了 UT2003 服务器的安装。 运行此类服务的命令是ucc server,因此UCC.exe 的完整路径在Path 下输入,server 在Arguments 下输入。
等效命令:
nssm set UT2003 Application C:\games\ut2003\System\UCC.exe
nssm set UT2003 AppDirectory C:\games\ut2003\System
nssm set UT2003 AppParameters server
单击 Install service 完成服务的安装。
Details tab(详细信息选项卡)
详细信息选项卡列出了有关服务的系统详细信息。
等效命令:
nssm set UT2003 DisplayName UT2k3
nssm set UT2003 Description Unreal Tournament 2003
nssm set UT2003 Start SERVICE_AUTO_START
Log on tab(登录选项卡)
登录选项卡可用于管理将运行服务的用户帐户。 nssm 将自动确保您选择的帐户具有必要的作为服务登录权限。
等效命令:
nssm set UT2003 ObjectName LocalSystem
nssm set UT2003 Type SERVICE_WIN32_OWN_PROCESS
Dependencies tab(依赖项选项卡)
Dependencies 选项卡列出了必须在服务运行之前启动的所有服务或服务组。
您可以输入服务名称或显示名称,每行一个。 服务组名称前面必须有 SC_GROUP_IDENTIFIER 前缀(+ 符号)。
等效命令:
nssm set UT2003 DependOnService MpsSvc
Process tab(进程选项卡)
Process 选项卡可用于设置应用程序的 process 优先级和 CPU 亲和性。 默认情况下,应用程序将以正常优先级运行,并允许在所有 CPU 上执行。 如果您希望将进程限制为可用 CPU 的子集,请取消选中“All processors”并根据需要选择 CPU。
服务运行时,可以从 Windows 任务管理器更改进程优先级和亲缘关系。
等效命令:
nssm set UT2003 AppPriority NORMAL_PRIORITY_CLASS
nssm set UT2003 AppNoConsole 0
nssm set UT2003 AppAffinity All
Shutdown tab(停止选项卡)
Shutdown选项卡列出了各种停止方法和超时,在崩溃后清理应用程序或正常停止服务时使用。
等效命令:
nssm set UT2003 AppStopMethodSkip 0
nssm set UT2003 AppStopMethodConsole 1500
nssm set UT2003 AppStopMethodWindow 1500
nssm set UT2003 AppStopMethodThreads 1500
Exit actions tab(退出动作选项卡)
退出动作 选项卡可以用来调整服务的重启 阈值 和默认的 退出动作。您也可以指定应用程序自动重启的间隔时间 强制延迟。
要为特定应用程序退出代码配置退出操作,您必须使用注册表,如下所述(https://nssm.cc/usage#exit)。
等效命令:
nssm set UT2003 AppThrottle 1500
nssm set UT2003 AppExit Default Restart
nssm set UT2003 AppRestartDelay 0
I/O tab(输入/输出 选项卡)
I/O 选项卡可用于指定启用 I/O 重定向 时使用的输入和/或输出文件。 设置 Output 和 Error 通常足以捕获应用程序生成的日志消息。
按照 下文 的说明在注册表中配置 I/O,以更好地控制路径和访问模式。
等效命令:
nssm set UT2003 AppStdout C:\games\ut2003\service.log
nssm set UT2003 AppStderr C:\games\ut2003\service.log
File rotation tab(文件轮换选项卡)
文件轮换选项卡可以与I/O设置一起使用,以配置服务重启时输出文件的轮换。
如果选中 Replace existing Output and/or Error files 复选框,nssm 将在启动服务时覆盖现有输出文件。 默认是附加到任何现有文件。 如果选中 Rotate files 复选框,nssm 将在设置 I/O 重定向之前重命名现有文件。 使用 Restrict rotation 字段来禁用文件轮换,这些文件的修改时间超过指定的 seconds 或小于指定的 kilobytes。
默认情况下,nssm 仅在服务(重新)启动时执行文件轮换。 要在服务运行时启用轮换到指定大小限制的文件,请选中 Rotate while service is running 复选框。 在线轮换忽略任何配置的文件期限。
危险,移动的部件! 在线轮换需要 nssm 来拦截应用程序的输出并自行写入文件。 复杂性的增加必然导致失败的风险增加。
等效命令:
nssm set UT2003 AppStdoutCreationDisposition 4
nssm set UT2003 AppStderrCreationDisposition 4
nssm set UT2003 AppRotateFiles 1
nssm set UT2003 AppRotateOnline 0
nssm set UT2003 AppRotateSeconds 86400
nssm set UT2003 AppRotateBytes 1048576
Environment tab(环境变量选项卡)
Environment 选项卡可用于指定以换行符分隔的 [环境变量] (https://nssm.cc/usage#environment) 列表以传递给应用程序。 如果选中 Replace default environment 复选框,则指定的变量将是传递给服务的 only 变量。 未选中时(默认),将保留服务启动时已经创建的环境变量。
等效命令:
nssm set <servicename> AppEnvironmentExtra JAVA_HOME=C:\java
Installing from the command line(从命令行安装)
从 2.0 版开始,您还可以绕过 GUI 并从命令行安装服务。 语法是:
nssm install <servicename> <application> [<options>]
请注意,输入到服务数据库的实际程序是 nssm 本身,因此您在安装服务后不得移动或删除 nssm.exe。 如果您确实希望更改 nssm.exe 的路径,您可以删除并重新安装服务或编辑 HKLM\System\CurrentControlSet\Services\servicename\ImagePath
以反映新位置。
Quoting issues(引用的问题)
nssm 正确处理带有空格的路径,但是由于命令提示符的工作方式,向它传递参数可能会很棘手。
如果应用程序的路径包含空格,则需要将其括在引号中,否则命令提示符会将路径解释为 两个 参数。
nssm install <servicename> "C:\Program Files\app.exe"
如果您希望提供的选项之一包含空格,则您也需要引用它 并且 引用引号本身。
nssm install <servicename> <application> """This is one argument"""
Isabella Sanfilippo 提出了一种从批处理文件安装 Java 应用程序的方法。
nssm install solr "%JavaExe%" -Dsolr.solr.home="\"%CD%\solr"\"
-Djetty.home="\"%CD%"\" -Djetty.logs="\"%CD%\logs"\" -cp
"\"%CD%\lib\*.jar"\";"\"%CD%\start.jar"\" -jar "\"%CD%\start.jar"\"
John Duffy 需要将引号传递给参数列表。
nssm set NodeServer3000 AppParameters """""""$Env:NODE_JS_NPM"""""" start"
Removing a service(删除服务)
nssm remove <servicename>
在删除服务之前会显示一个确认窗口。
从 2.0 版开始,您还可以从命令行删除服务,即:
nssm remove <servicename> confirm
警告: nssm 会很高兴地尝试删除任何服务,而不仅仅是 nssm 自己管理的服务。 尽量不要删除您不应该删除的服务…
Service shutdown(关闭服务)
当 nssm 收到来自 Windows 服务管理器的停止命令,或者当它检测到被监控的应用程序已经退出时,它会尝试正常地关闭被监控的应用程序和所有子进程。 如果应用程序的进程树没有及时退出,nssm 可以强制终止所有属于该应用程序的进程和子进程。
nssm 可以使用四个阶段来关闭应用程序,默认情况下它将依次尝试所有四个阶段。 可以(尽管不推荐)禁用部分或所有方法的使用。 不同的应用程序将对各种请求做出不同的响应,因此将它们全部启用通常是确保应用程序正常关闭的最佳方式。