NSSM - 将任何exe应用封装成windows服务的神器
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 下输入,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 可以使用四个阶段来关闭应用程序,默认情况下它将依次尝试所有四个阶段。 可以(尽管不推荐)禁用部分或所有方法的使用。 不同的应用程序将对各种请求做出不同的响应,因此将它们全部启用通常是确保应用程序正常关闭的最佳方式。
首先 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。 将其更改为 Ignore 或 Exit 以指定所采取的操作。 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) 值 AppPriority,nssm 会将其值解释为 SetPriorityClass()
的参数,并以指定的优先级启动应用程序。
如果设置了字符串 (REG_SZ) 值 AppAffinity,nssm 会将其解释为以逗号分隔的 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
参数。
通常,建议同时设置 AppStdout 和 AppStderr 以记录输出,因为应用程序可能会分别记录信息和错误消息。
可以将 stderr 和 stdout 指向同一路径,但由于 nssm 的限制,您必须在 AppStdout 和 AppStderr 注册表值中提供 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) 值 AppRotateSeconds,nssm 将不会轮换任何上次修改的文件少于前面配置的秒数。
如果设置了整数(REG_DWORD)值AppRotateBytes, nssm将不会轮换任何比配置的字节数小的文件。nssm还可以处理大到不能用32位表示的文件,以防您认为日志文件可以增长到4GB,但再大就“太大”了。AppRotateBytesHigh的值将被解释为64位大小的高阶部分。
如果 AppRotateSeconds 和 AppRotateBytes(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,按需轮换也将起作用,即如果服务在运行时不会轮换文件。 但是,除非同时配置了 AppRotate 和 AppRotateOnline ,否则它将不起作用。
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
更多推荐
所有评论(0)