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 下输入,serverArguments 下输入。
NSSM - 将任何exe应用封装成windows服务的神器_第1张图片
等效命令:

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 - 将任何exe应用封装成windows服务的神器_第2张图片
等效命令:

nssm set UT2003 DisplayName UT2k3
nssm set UT2003 Description Unreal Tournament 2003
nssm set UT2003 Start SERVICE_AUTO_START

Log on tab(登录选项卡)

登录选项卡可用于管理将运行服务的用户帐户。 nssm 将自动确保您选择的帐户具有必要的作为服务登录权限。
NSSM - 将任何exe应用封装成windows服务的神器_第3张图片
等效命令:

nssm set UT2003 ObjectName LocalSystem
nssm set UT2003 Type SERVICE_WIN32_OWN_PROCESS

有关在命令行上配置帐户和密码的详细信息,请参阅命令行使用 文档。 如果您需要配置一个空白密码,您必须使用命令行。

Dependencies tab(依赖项选项卡)

Dependencies 选项卡列出了必须在服务运行之前启动的所有服务或服务组。

您可以输入服务名称或显示名称,每行一个。 服务组名称前面必须有 SC_GROUP_IDENTIFIER 前缀(+ 符号)。
NSSM - 将任何exe应用封装成windows服务的神器_第4张图片
等效命令:

nssm set UT2003 DependOnService MpsSvc

Process tab(进程选项卡)

Process 选项卡可用于设置应用程序的 process 优先级和 CPU 亲和性。 默认情况下,应用程序将以正常优先级运行,并允许在所有 CPU 上执行。 如果您希望将进程限制为可用 CPU 的子集,请取消选中“All processors”并根据需要选择 CPU。

服务运行时,可以从 Windows 任务管理器更改进程优先级和亲缘关系。
NSSM - 将任何exe应用封装成windows服务的神器_第5张图片
等效命令:

nssm set UT2003 AppPriority NORMAL_PRIORITY_CLASS
nssm set UT2003 AppNoConsole 0
nssm set UT2003 AppAffinity All

Shutdown tab(停止选项卡)

Shutdown选项卡列出了各种停止方法和超时,在崩溃后清理应用程序或正常停止服务时使用。
NSSM - 将任何exe应用封装成windows服务的神器_第6张图片
等效命令:

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 - 将任何exe应用封装成windows服务的神器_第7张图片
等效命令:

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 - 将任何exe应用封装成windows服务的神器_第8张图片
等效命令:

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 - 将任何exe应用封装成windows服务的神器_第9张图片
等效命令:

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 - 将任何exe应用封装成windows服务的神器_第10张图片
等效命令:

nssm set  AppEnvironmentExtra JAVA_HOME=C:\java

Installing from the command line(从命令行安装)

从 2.0 版开始,您还可以绕过 GUI 并从命令行安装服务。 语法是:

nssm install   []

请注意,输入到服务数据库的实际程序是 nssm 本身,因此您在安装服务后不得移动或删除 nssm.exe。 如果您确实希望更改 nssm.exe 的路径,您可以删除并重新安装服务或编辑 HKLM\System\CurrentControlSet\Services\servicename\ImagePath 以反映新位置。

Quoting issues(引用的问题)

nssm 正确处理带有空格的路径,但是由于命令提示符的工作方式,向它传递参数可能会很棘手。

如果应用程序的路径包含空格,则需要将其括在引号中,否则命令提示符会将路径解释为 两个 参数。

nssm install  "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>

NSSM - 将任何exe应用封装成windows服务的神器_第11张图片
在删除服务之前会显示一个确认窗口。
NSSM - 将任何exe应用封装成windows服务的神器_第12张图片
从 2.0 版开始,您还可以从命令行删除服务,即:

nssm remove <servicename> confirm

☢警告: nssm 会很高兴地尝试删除任何服务,而不仅仅是 nssm 自己管理的服务。 尽量不要删除您不应该删除的服务…

Service shutdown(关闭服务)

nssm 收到来自 Windows 服务管理器的停止命令,或者当它检测到被监控的应用程序已经退出时,它会尝试正常地关闭被监控的应用程序和所有子进程。 如果应用程序的进程树没有及时退出,nssm 可以强制终止所有属于该应用程序的进程和子进程。

nssm 可以使用四个阶段来关闭应用程序,默认情况下它将依次尝试所有四个阶段。 可以(尽管不推荐)禁用部分或所有方法的使用。 不同的应用程序将对各种请求做出不同的响应,因此将它们全部启用通常是确保应用程序正常关闭的最佳方式。
NSSM - 将任何exe应用封装成windows服务的神器_第13张图片
首先 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 只会在此键不存在时创建它。 您的更改不会被覆盖。
NSSM - 将任何exe应用封装成windows服务的神器_第14张图片
要为特定退出代码指定不同的操作,请在 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 - 将任何exe应用封装成windows服务的神器_第15张图片
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 还可以在服务运行时轮换文件。 请参阅下面的 在线轮换。
NSSM - 将任何exe应用封装成windows服务的神器_第16张图片
要启用轮换,请创建一个整数 (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
NSSM - 将任何exe应用封装成windows服务的神器_第17张图片
如果您只希望环境变量 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 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

%NSSM% set %SERVICE_NAME% AppStdout %CD%\logs\%SERVICE_NAME%_stdout.log
%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

你可能感兴趣的:(windows,服务器,java)