NSSM 是一个服务封装程序,它可以将普通 exe 程序 或 Java程序 或 Nodejs 项目封装成服务,像 windows 服务一样运行。同类型的工具还有微软自己的 srvany,不过 NSSM 更加简单易用,并且功能强大。它的特点如下:

  • 支持普通 exe 程序(控制台程序或者带界面的 Windows 程序都可以)
  • 安装简单,修改方便
  • 可以重定向输出(并且支持 Rotation)
  • 可以自动守护封装了的服务,程序挂掉了后可以自动重启
  • 可以自定义环境变量

用法

不需要“安装” 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 下输入,serverArguments 下输入。
在这里插入图片描述
等效命令

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 重定向 时使用的输入和/或输出文件。 设置 OutputError 通常足以捕获应用程序生成的日志消息。

按照 下文 的说明在注册表中配置 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 可以使用四个阶段来关闭应用程序,默认情况下它将依次尝试所有四个阶段。 可以(尽管不推荐)禁用部分或所有方法的使用。 不同的应用程序将对各种请求做出不同的响应,因此将它们全部启用通常是确保应用程序正常关闭的最佳方式。
在这里插入图片描述
首先 nssm 将尝试生成一个 Control-C 事件并将其发送到应用程序的控制台。 批处理脚本或控制台应用程序可能会拦截事件并优雅地关闭自己。 Java 应用程序倾向于很好地响应 Control-C 事件。 GUI 应用程序没有控制台并且不会响应此方法。 在 Windows 2000 上不支持。

其次,nssm 将枚举应用程序创建的所有窗口并向它们发送WM_CLOSE 消息。 应用程序可以遵循通过启动正常退出来响应消息的约定。

第三,nssm 将枚举应用程序创建的所有线程并向它们发送WM_QUIT 消息,如果应用程序有线程消息队列,则将收到该消息。

作为最后的手段,nssm 可以调用 TerminateProcess() 来请求操作系统强制终止应用程序。 TerminateProcess() 调用不能被捕获或忽略,因此在大多数情况下应用程序将被终止。 但是,它不太可能在退出之前执行任何清理操作。

要禁用上述任何方法,请创建一个整数 (REG_DWORD) 值 HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppStopMethodSkip 并将其设置为以下一个或多个数字的总和。

  • 1 - 不要将 Control-C 发送到控制台。
  • 2 - 不要将 WM_CLOSE 发送到 Windows。
  • 4 - 不要将 WM_QUIT 发送到线程。
  • 8 - 不要调用 TerminateProcess()

例如,如果您知道应用程序没有响应 Control-C 并且没有线程消息队列,则可以将 AppStopMethodSkip 设置为 5。

⚠重要: 强烈建议禁用 TerminateProcess() 调用。 当服务停止时,nssm 将退出。 如果应用程序在此之前没有终止,它可能会继续运行,nssm 将不再能够控制它。

默认情况下,在尝试上述每个方法后,nssm 最多会等待 1500 毫秒,让应用程序退出。 通过在注册表中的 HKLM\System\CurrentControlSet\Services\servicename\Parameters 下创建整数 (REG_DWORD) 值并将它们设置为所需的等待毫秒数,可以基于每个方法配置超时。

  • AppStopMethodConsole - 发送 Control-C 后的等待时间。
  • AppStopMethodWindow - 发送 WM_CLOSE 后的等待时间。
  • AppStopMethodThreads - 发送 WM_QUIT 后的等待时间。

🏷注意: 请注意,超时适用于应用程序生成的所有进程,因此如果应用程序有多个子进程,总超时时间可能会比预期的长。

Actions on exit(退出时的动作)

要配置应用程序退出时 nssm 应采取的操作,请编辑键 HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppExit 的默认值。 如果在 nssm 运行时注册表中不存在该键,它将创建它并将值设置为 Restart。 将其更改为 IgnoreExit 以指定所采取的操作。 nssm 只会在此键不存在时创建它。 您的更改不会被覆盖。
在这里插入图片描述
要为特定退出代码指定不同的操作,请在 AppExit 键下创建一个字符串 (REG_SZ) 值,其名称是正在考虑的退出代码。 例如,要在退出代码为 0 时停止服务(这通常意味着应用程序成功完成),请创建 HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppExit\0 并将其设置为 Exit。 在事件日志中查找来自 nssm 的消息,以查看您的应用程序返回了哪些退出代码。

如果您的应用程序的退出代码与注册表项不对应,nssm 将在决定执行操作时使用默认值 AppExit

Restart delay(重启延迟)

从2.22版本开始,nssm可以在应用程序重启之间应用强制延迟。例如,可以使用它定期运行一个命令,比如每小时运行一个批处理脚本。

要指定重新启动延迟,请创建一个整数 (REG_DWORD) 值 HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppRestartDelay 并将其设置为重新启动之间等待的毫秒数。

在等待下一次重启时,服务将报告其状态为暂停。向它发送一个Continue控制将暂时取消延迟并立即触发重新启动。

请参阅下面有关重新启动限制的部分,了解在配置限制和重新启动延迟时 nssm 如何工作的说明。

Restart throttling(重启阈值)

为了避免紧密的 CPU 循环,如果受监控的应用程序在启动后过早退出,nssm 将限制服务的重新启动。 默认情况下,使用 1500 毫秒的阈值。 要指定不同的值,请创建一个整数 (REG_DWORD) 值 HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppThrottle 并将其设置为所需的毫秒数。

将尝试第一次重启,没有延迟。如果重新启动的应用程序在运行到阈值毫秒数之前继续退出,nssm将至少暂停2000毫秒,这将使每次后续失败的暂停时间加倍。它将暂停的最大时间是256000毫秒,大约4分钟。当服务成功运行超过阈值时间后,重置延迟计数器。

如果您确定服务失败的原因并采取措施纠正问题,您可以向服务发送Continue控制,该控件将显示为已暂停。 通过这种方式,您可以避免等待下一次重新启动尝试。

当配置了重启延迟并且应用程序提前退出时,nssm将通过配置的延迟和计算的延迟时间的来限制重启。例如,如果您配置了3000毫秒的重启延迟,并且服务在每次启动时都失败,那么第一次重启尝试将延迟3000毫秒,因为配置的3000毫秒比限制的0毫秒长。第二次尝试也将延迟3000毫秒;配置3000毫秒比阈值2000毫秒还要长。第三次尝试将延迟4000毫秒;超过配置的3000毫秒。

由于这个原因,如果你打算使用重启延迟来配置一个间隔小于5分钟的短时间运行的服务,你应该考虑降低AppThrottle的值。

Process priority and CPU affinity(进程优先级和CPU亲和性)

从 2.22 版开始,nssm 可以管理托管应用程序的 CPU 亲和性和进程优先级。

默认情况下,应用程序将以正常进程优先级启动,并允许在任何 CPU 上执行。 nssm 将在 HKLM\System\CurrentControlSet\Services\servicename\Parameters 下查找注册表项以配置应用程序启动。

如果设置了整数 (REG_DWORD) 值 AppPrioritynssm 会将其值解释为 SetPriorityClass() 的参数,并以指定的优先级启动应用程序。

如果设置了字符串 (REG_SZ) 值 AppAffinitynssm 会将其解释为以逗号分隔的 CPU ID 列表,从应用程序可以运行的 0 开始。 或者,可以通过用破折号分隔索引来指定 ID 的范围。

只有数字、破折号和逗号在关联字符串中有效。

例如,字符串 0-2,4 指定应用程序可以在系统中的第一个、第二个、第三个和第五个 CPU 上运行。

Console window(控制台窗口)

从 2.22 版开始,nssm 将默认为应用程序创建一个新的控制台窗口。 这允许一些程序运行,否则会失败,例如那些希望能够读取用户输入的程序。 如果不需要控制台窗口,可以通过将 HKLM\System\CurrentControlSet\Services\servicename\Parameters 下的整数 (REG_DWORD) 值 AppNoConsole 设置为非零值来禁用它。

I/O redirection(I/O 重定向)

nssm 可以将托管应用程序的 I/O 重定向到任何可由 CreateFile() 打开的路径。 如果您想捕获应用程序的控制台s输入输出,此功能可能很有用。
在这里插入图片描述
nssm 将在 HKLM\System\CurrentControlSet\Services\servicename\Parameters 下查找与 CreateFile() 的参数对应的键。 所有都是可选的。 如果没有为特定流指定路径,则不会重定向。 如果给出了一个路径但没有给出任何其他值,则它们将接收合理的默认值。

  • AppStdin (string) -接收输入的路径。
  • AppStdinShareMode (integer) - 输入的ShareMode参数。
  • AppStdinCreationDisposition (integer) - 输入的CreationDisposition参数。
  • AppStdinFlagsAndAttributes (integer) - 输入的 FlagsAndAttributes 参数。
  • AppStdout (string) - 接收输出的路径。
  • AppStdoutShareMode (integer) - 输出的ShareMode参数。
  • AppStdoutCreationDisposition (integer) - 输出的CreationDisposition参数。
  • AppStdoutFlagsAndAttributes (integer) - 输出的 FlagsAndAttributes 参数。
  • AppStderr (string) - 接收错误输出的路径。
  • AppStderrShareMode (integer) - 错误输出的ShareMode参数。
  • AppStderrCreationDisposition (integer) - 错误输出的CreationDisposition参数。
  • AppStderrFlagsAndAttributes (integer) - 错误输出的 FlagsAndAttributes 参数。

通常,建议同时设置 AppStdoutAppStderr 以记录输出,因为应用程序可能会分别记录信息和错误消息。

可以将 stderr 和 stdout 指向同一路径,但由于 nssm 的限制,您必须在 AppStdoutAppStderr 注册表值中提供 exact 相同的字符串。 只有当这两个条目相同时,nssm 才能交错两个流。

File rotation(文件轮换)

从版本 2.22 开始,如果启用 I/O 重定向nssm 可以在启动应用程序之前轮换现有的输出文件。 nssm 还可以在服务运行时轮换文件。 请参阅下面的 在线轮换
在这里插入图片描述
要启用轮换,请创建一个整数 (REG_DWORD) 值 HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppRotate 并将其设置为 1。在(重新)启动服务之前,nssm 将轮换文件 如果它们已经存在,则在 AppStdout 和/或 AppStderr 中配置。

现有文件将根据使用文件最后修改时间的模板重命名。 例如,C:\Services\myservice.log 可能会轮换为 C:\Services\myservice-20140114T180840.953.log

注意,时间戳是ISO8601格式的,因此按名称排序的轮换文件列表将首先显示最老的文件,并且它包含毫秒部分,因此,如果服务退出并在不到一秒的时间内重新启动,文件将不会丢失。

HKLM\System\CurrentControlSet\Services\servicename\Parameters 下的两个附加注册表设置可用于调整 nssm 轮换文件的方式。

如果设置了整数 (REG_DWORD) 值 AppRotateSecondsnssm 将不会轮换任何上次修改的文件少于前面配置的秒数。

如果设置了整数(REG_DWORD)值AppRotateBytesnssm将不会轮换任何比配置的字节数的文件。nssm还可以处理大到不能用32位表示的文件,以防您认为日志文件可以增长到4GB,但再大就“太大”了。AppRotateBytesHigh的值将被解释为64位大小的高阶部分。

如果 AppRotateSecondsAppRotateBytes(High) 都设置了,nssm 将要求同时满足这两个条件才能轮换文件。

Online rotation(在线轮换)

如果整数 (REG_DWORD) 值 AppRotateOnline 设置为 1,nssm 可以在服务运行时轮换增长到指定配置的文件大小限制的文件。 为了在线轮换,AppRotateSeconds 的值被忽略,尽管它仍会在服务(重新)启动之前申请轮换。

如果 AppRotate 未设置,AppRotateOnline 将被忽略。

启用在线轮换后,nssm 会读取应用程序的标准输出和/或标准错误,并自行写入输出文件。 与简单的 I/O 重定向相比,这样做会引入一定程度的复杂性,因此不应将其用于不需要它的服务。 尽管 nssm 会尝试优雅地处理 I/O 错误,但如果出现问题,应用程序的输出可能会丢失,直到服务重新启动。 有关 nssm 如何处理 I/O 重定向的更多详细信息,请参阅 技术讨论

On-demand rotation(按需轮换)

nssm 可以按需轮换输出文件,无论它们是否达到配置的大小限制。 要请求服务的文件轮换,请发送用户定义的服务control 128 或运行 以下命令

nssm rotate <servicename>

按需轮换的一个限制是,在从应用程序读取下一行输入之前,不会发生实际的文件重命名。 因此,在发出轮换请求和轮换发生之间可能会有相当长的延迟,具体取决于应用程序的详细程度。

即使没有配置AppRotateBytes,按需轮换也将起作用,即如果服务在运行时不会轮换文件。 但是,除非同时配置了 AppRotateAppRotateOnline ,否则它将不起作用。

I/O redirection technical details(I/O 重定向技术细节)

在查看服务如何处理 I/O 时,需要考虑三种情况。

No redirection(无重定向)

在最简单的情况下,nssm 没有配置任何 I/O 重定向。 它将使用连接到控制台实例的标准输入、标准输出和标准错误启动应用程序。 如果服务在 LOCALSYSTEM 帐户下运行并配置为与桌面交互,则您可以直接查看输出。

I/O redirected; online rotation disabled(I/O 重定向; 禁用在线轮换)

如果 stdout 和/或 stderr 被重定向并且在线轮换被禁用,nssm 将调用 CreateFile() 为每个 I/O 流打开一个句柄,然后调用 DuplicateHandle() 来设置句柄的副本 STARTUPINFO 数据结构传递给CreateProcess()。 因此,应用程序将使用打开的文件句柄运行,而 nssm 本身没有打开的句柄。

I/O redirected; online rotation enabled(I/O 重定向; 启用在线轮换)

这种情况是迄今为止三者中最复杂的,因此必然最有可能出现问题,可能导致应用程序的输出丢失。

nssm 首先调用 CreateFile(),就像在前面的例子中一样。 然后它调用CreatePipe()来打开一个匿名管道。 管道的读取端和输出文件的句柄被传递给执行实际写入的新线程。 管道的写入端与 DuplicateHandle() 复制以传递给 CreateProcess()。 因此,应用程序将使用管道一端的打开句柄运行,nssm 将使用管道另一端的句柄和输出文件的句柄运行。

写入线程运行一个简单的循环,其中它从管道中读取数据,即应用程序的输出,使用 ReadFile() 将数据写入缓冲区,然后使用 WriteFile() 将该缓冲区的内容写入输出文件。 如果文件达到配置的大小限制,线程将写入下一个换行符,关闭其输出句柄,轮换文件并打开一个新句柄以继续写入新文件。

nssm 接收到按需轮换请求时,它将设置一个标志,指示写入线程在下一次 ReadFile() 调用完成后执行轮换,无论文件大小如何。 因为 ReadFile() 会阻止执行,直到读取某些内容,所以 nssm 实际上不会轮换文件,直到应用程序产生下一行输出。

nssm 不知道应用程序的输出是 Unicode 还是 ANSI,因此在将第一个数据写入文件或轮换之前,它会调用 IsTextUnicode() 来尝试确定其中的文本编码 利用。 如果它(看起来像)是 Unicode,nssm 将 UTF-16 字节顺序标记写入新文件的开头,以便在使用文本编辑器打开时正确读取。

如果 stdout 和 stderr 都被重定向并是分离的不同文件,nssm 将为每个生成一个写入线程。 nssm 将处理一个应用程序,它在 Unicode 中编写 stdout,在 ANSI 中编写 stderr - 反之亦然 - 如果你不幸(或邪恶)足以运行一个。

🏷注意: 从上面可以清楚地看出,在线轮换存在许多陷阱。 nssm 将尝试优雅地处理 I/O 过程中的任何问题,但为了安全起见,您应该考虑不要使用在线轮换,除非您的输出非常庞大以至于您别无选择。

Environment variables(环境变量)

从 2.11 版开始,nssm 尊重 srvany 支持的 AppEnvironment 注册表值。 要指定要传递给受监视应用程序的环境变量列表,请创建一个多值字符串 (REG_MULTI_SZ) 值 HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppEnvironment,其中每个条目的格式为 KEY=VALUE
在这里插入图片描述
如果您只希望环境变量 KEY 存在但 = 符号是强制性的,则可以省略 VALUE如果指定的环境变量无效,服务将无法运行!

从 2.19 版开始,nssm 还尊重 AppEnvironmentExtra 注册表值,其格式应与 AppEnvironment 相同。 AppEnvironmentExtra 中设置的环境变量将被添加到服务的默认环境中。

为了与 srvany 兼容,AppEnvironment 中指定的环境变量将替换服务启动时系统设置的环境变量。 由于这可能不是您想要的,请改用 AppEnvironmentExtra

实战例子

安装nginx服务

批处理文件install_nginx-server.bat

REM 进入当前批处理文件所在的目录
cd /d %~dp0
@echo OFF

REM 设置NSSM名
set NSSM="nssm.exe"

REM 设置Service服务名
set SERVICE_NAME=Nginx

REM 设置APP文件名
set APP_NAME=nginx.exe

REM 设置APP参数
set APP_OPS=-c conf/nginx.conf

@echo ON
REM 安装服务
%NSSM% install %SERVICE_NAME% %APP_NAME%
if not %errorlevel%==0 (
  echo "发生错误!请检查当前服务配置"
  goto :end
)

REM 设置服务参数
%NSSM% set %SERVICE_NAME% DisplayName "%SERVICE_NAME%"
%NSSM% set %SERVICE_NAME% Description "this is %SERVICE_NAME%"

%NSSM% set %SERVICE_NAME% AppDirectory %CD%
%NSSM% set %SERVICE_NAME% AppParameters "%APP_OPS%"

%NSSM% set %SERVICE_NAME% AppExit Default Restart
%NSSM% set %SERVICE_NAME% AppRestartDelay 10

%NSSM% set %SERVICE_NAME% AppRotateFiles 1
%NSSM% set %SERVICE_NAME% AppRotateSeconds 86400
%NSSM% set %SERVICE_NAME% AppRotateBytes 100000000
%NSSM% set %SERVICE_NAME% AppTimestampLog 1

%NSSM% set %SERVICE_NAME% ObjectName LocalSystem
%NSSM% set %SERVICE_NAME% Start SERVICE_AUTO_START
%NSSM% set %SERVICE_NAME% Type SERVICE_WIN32_OWN_PROCESS

REM %NSSM% set %SERVICE_NAME% AppStdout %CD%\logs\%SERVICE_NAME%_stdout.log
REM %NSSM% set %SERVICE_NAME% AppStderr %CD%\logs\%SERVICE_NAME%_stderr.log

echo "安装成功!"

:end
PAUSE

安装Tomcat服务

批处理文件install_tomcat9x_service.bat

REM 进入当前批处理文件所在的目录
cd /d %~dp0
@echo OFF

REM 设置NSSM名
set NSSM="nssm.exe"

REM 设置Service服务名
set SERVICE_NAME=tomcat9x

REM 设置APP文件名
set APP_NAME=java

REM 设置APP参数
set APP_OPTS=-Dfile.encoding=UTF-8 -Duser.timezone=GMT+8 -Duser.language=zh -Duser.country=CN -Djava.net.preferIPv4Stack=true
set APP_OPTS=%APP_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=./conf/logging.properties -Djava.endorsed.dirs=./endorsed
set APP_OPTS=%APP_OPTS% -Dcatalina.base=. -Dcatalina.home=. -Djava.io.tmpdir=./temp -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
set APP_OPTS=%APP_OPTS% -classpath "./bin/bootstrap.jar;./bin/tomcat-juli.jar" -Djava.library.path="."
set APP_OPTS=%APP_OPTS% -XX:+UseG1GC -XX:MaxGCPauseMillis=10 -XX:GCPauseIntervalMillis=200 -XX:+UseCodeCacheFlushing -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+UseFastAccessorMethods
set APP_OPTS=%APP_OPTS% -server -Xms1g -Xmx1g -XX:ReservedCodeCacheSize=256m -XX:MaxMetaspaceSize=512m
set APP_OPTS=%APP_OPTS% -Dspring.profiles.active=test -DhttpPort=8080 -DsslPort=8443 -DstopPort=-1 -DjvmRoute=%TIME%
set APP_OPTS=%APP_OPTS% org.apache.catalina.startup.Bootstrap start

@echo ON
REM 安装服务
%NSSM% install %SERVICE_NAME% %APP_NAME%
if not %errorlevel%==0 (
  echo "发生错误!请检查当前服务配置"
  goto :end
)

REM 设置服务参数
%NSSM% set %SERVICE_NAME% DisplayName "%SERVICE_NAME%"
%NSSM% set %SERVICE_NAME% Description "this is %SERVICE_NAME%"

%NSSM% set %SERVICE_NAME% AppDirectory %CD%
%NSSM% set %SERVICE_NAME% AppParameters "%APP_OPTS%"

%NSSM% set %SERVICE_NAME% AppStopMethodConsole 30000
%NSSM% set %SERVICE_NAME% AppStopMethodWindow 30000
%NSSM% set %SERVICE_NAME% AppStopMethodThreads 30000

%NSSM% set %SERVICE_NAME% AppExit Default Restart
%NSSM% set %SERVICE_NAME% AppRestartDelay 10

%NSSM% set %SERVICE_NAME% AppRotateFiles 0
%NSSM% set %SERVICE_NAME% AppRotateSeconds 86400
%NSSM% set %SERVICE_NAME% AppRotateBytes 100000000
%NSSM% set %SERVICE_NAME% AppTimestampLog 1

%NSSM% set %SERVICE_NAME% ObjectName LocalSystem
%NSSM% set %SERVICE_NAME% Start SERVICE_AUTO_START
%NSSM% set %SERVICE_NAME% Type SERVICE_WIN32_OWN_PROCESS

REM %NSSM% set %SERVICE_NAME% AppStdout %CD%\logs\%SERVICE_NAME%_stdout.log
REM %NSSM% set %SERVICE_NAME% AppStderr %CD%\logs\%SERVICE_NAME%_stderr.log

echo "安装成功!"

:end
PAUSE

安装Java的jar程序

REM 进入当前批处理文件所在的目录
cd /d %~dp0
@echo OFF

REM 设置NSSM名
set NSSM="nssm.exe"

REM 设置Service服务名
set SERVICE_NAME=WmsSyncFile

REM 设置APP文件名
set APP_NAME=java

REM 设置APP参数
set APP_OPTS=-Xmx1g -jar WmsSyncFile-1.0.0.jar --spring.profiles.active=prod

@echo ON
REM 安装服务
%NSSM% install %SERVICE_NAME% %APP_NAME%
if not %errorlevel%==0 (
  echo "发生错误!请检查当前服务配置"
  goto :end
)

REM 设置服务参数
%NSSM% set %SERVICE_NAME% DisplayName "%SERVICE_NAME%"
%NSSM% set %SERVICE_NAME% Description "this is %SERVICE_NAME%"

%NSSM% set %SERVICE_NAME% AppDirectory %CD%
%NSSM% set %SERVICE_NAME% AppParameters "%APP_OPTS%"

%NSSM% set %SERVICE_NAME% AppStopMethodConsole 30000
%NSSM% set %SERVICE_NAME% AppStopMethodWindow 30000
%NSSM% set %SERVICE_NAME% AppStopMethodThreads 30000

%NSSM% set %SERVICE_NAME% AppExit Default Restart
%NSSM% set %SERVICE_NAME% AppRestartDelay 10

%NSSM% set %SERVICE_NAME% AppRotateFiles 1
%NSSM% set %SERVICE_NAME% AppRotateSeconds 86400
%NSSM% set %SERVICE_NAME% AppRotateBytes 100000000
%NSSM% set %SERVICE_NAME% AppTimestampLog 1

%NSSM% set %SERVICE_NAME% ObjectName LocalSystem
%NSSM% set %SERVICE_NAME% Start SERVICE_AUTO_START
%NSSM% set %SERVICE_NAME% Type SERVICE_WIN32_OWN_PROCESS

REM %NSSM% set %SERVICE_NAME% AppStdout %CD%\logs\%SERVICE_NAME%_stdout.log
REM %NSSM% set %SERVICE_NAME% AppStderr %CD%\logs\%SERVICE_NAME%_stderr.log

echo "安装成功!"

:end
PAUSE

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐