NSSM(Non-Sucking Service Manager)是一个免费、开源的Windows服务管理工具,主要用于将普通的可执行程序(如EXE、BAT脚本、Java JAR文件等)封装注册为Windows系统服务,使其能够像系统服务一样具备自动启动、后台运行、故障恢复等功能。这个工具因为其易于使用、功能全面且稳定可靠而受到许多系统管理员和技术人员的喜爱。

NSSM - the Non-Sucking Service Manager

NSSM - the Non-Sucking Service Manager

GitHub - kirillkovalenko/nssm: Non-Sucking Service Manager

GitHub - dkxce/NSSM: The Non-Sucking Service Manager

GitHub - xxnuo/Nssm-Chinese: Nssm_ ch - Windows 系统服务管理器 提供GUI管理Win系统服务的添加、修改、删除

 

 

NSSM(Non-Sucking Service Manager)是一个免费、开源的Windows服务管理工具,主要用于将普通的可执行程序(如EXE、BAT脚本、Java JAR文件等)封装注册为Windows系统服务,使其能够像系统服务一样具备自动启动、后台运行、故障恢复等功能。这个工具因为其易于使用、功能全面且稳定可靠而受到许多系统管理员和技术人员的喜爱。

NSSM的主要特点包括:

  1. 简易性:通过简单的命令行操作或图形界面,用户可以轻松地安装、配置和管理服务,无需复杂的编程或系统知识。
  2. 灵活性:支持多种类型的应用程序转换为服务,包括控制台程序、GUI程序、脚本等。
  3. 稳定性:提供了强大的监视和恢复机制,当被封装的应用程序意外终止时,NSSM可以自动重新启动该程序,保证服务的持续运行。
  4. 高级配置:允许用户自定义服务的启动参数、工作目录、优先级、日志记录方式等,提供高度定制化的服务管理能力。
  5. 跨平台兼容性:尽管NSSM主要面向Windows环境,但它也能够在一些类Unix系统(通过Cygwin等层)上工作。

为什么使用NSSM:

  • 自动化管理:对于需要长期在后台运行的任务,如服务器监控、日志收集、定时任务等,将其设为服务可以实现开机自启,减少人工干预。
  • 提高可靠性:NSSM的故障恢复功能可以确保关键应用在遇到崩溃时能够快速恢复,增强系统的稳定性和可用性。
  • 简化部署:对于需要部署在多台服务器上的相同服务,使用NSSM可以标准化服务的安装和配置流程,降低维护成本。

 NSSM是一个强大且实用的工具,特别适合那些需要将应用程序以服务形式部署在Windows服务器环境中的场景。

NSSM(Non-Sucking Service Manager)的功能可以根据其提供的服务管理和配置能力,大致分类如下:

  1. 服务安装与卸载:

    • 安装服务: 将任何可执行文件(如.exe, .bat, Java jar等)注册为Windows服务。
    • 卸载服务: 从系统服务列表中移除之前安装的服务,同时可选择是否删除相关配置。
  2. 服务控制与监控:

    • 启动/停止/暂停/继续服务: 提供控制服务运行状态的基本操作。
    • 自动恢复: 当监控的服务意外终止时,自动重启服务,确保服务持续运行。
    • 日志记录: 记录服务运行时的日志,包括标准输出、标准错误和调试信息,便于问题排查。
    • 健康检查: 定期检测服务状态,根据预设条件判断服务是否正常运行。
  3. 高级配置选项:

    • 服务优先级设置: 调整服务进程的CPU调度优先级。
    • 工作目录与路径配置: 自定义服务运行的工作目录及可执行文件路径。
    • 环境变量管理: 添加或修改服务运行所需的环境变量。
    • 服务参数配置: 设置服务启动时需要传递的命令行参数。
    • 资源限制: 限制服务使用的内存、CPU等资源。
  4. 用户账户管理:

    • 运行身份配置: 指定服务以特定用户账户权限运行,提升或限制服务访问资源的能力。
  5. 图形界面与命令行支持:

    • 图形界面操作: 提供直观的界面进行服务管理和配置。
    • 命令行工具: 所有功能均支持命令行操作,适合自动化脚本和远程管理。
  6. 兼容性与跨平台支持:

    • Windows平台兼容: 支持多种Windows操作系统版本。
    • 跨平台能力: 虽然主要面向Windows,但通过Cygwin等工具,也能在某些类Unix环境使用。

通过这些分类的功能,NSSM为系统管理员和开发者提供了一个强大且灵活的工具,以便将各种应用程序无缝集成到Windows服务管理体系中,提升系统维护的效率和可靠性。

NSSM(Non-Sucking Service Manager)的底层原理主要涉及与Windows操作系统的底层服务控制管理接口(Service Control Manager, SCM)的交互。以下是一些关键的技术点和原理:

  1. 服务注册与配置: NSSM通过调用Windows API函数(如CreateService)与SCM交互,向系统注册一个新的服务。在注册过程中,它会提供服务名称、显示名称、启动类型(自动、手动、禁用)、服务二进制路径、启动参数、服务恢复选项等信息。这使得原本的可执行文件能够按照服务的方式被系统管理。

  2. 服务启动与控制: 当服务需要启动时,NSSM通过发送控制请求(如START_SERVICE_CONTROL_REQUEST)给SCM,后者再通知服务开始执行。NSSM还可以发送命令来停止、暂停、继续服务,以及查询服务状态。这一过程涉及到对服务主进程的创建与管理。

  3. 进程监控与重启策略: NSSM实现了一套监控机制,它通过单独的监控进程跟踪服务主进程的状态。如果服务意外终止,NSSM会根据预先配置的策略(如重启次数、重启间隔)自动重启服务。这通常涉及对服务进程的句柄监控和事件监听。

  4. 日志重定向: NSSM支持将服务输出(标准输出和错误流)重定向到文件,甚至支持日志文件的自动轮转(log rotation)。这通过修改服务进程的创建参数和使用API(如CreatePipeSetStdHandle)来实现,确保服务产生的输出能够被正确捕获和管理。

  5. 环境变量与权限管理: NSSM允许用户为服务进程配置特定的环境变量和运行账户(如Local System、Network Service或指定用户)。这需要在创建服务时或通过更新服务配置来调整,可能涉及调用如ChangeServiceConfig等API。

  6. 资源限制: 虽然Windows本身对服务的资源限制功能不如Linux等系统丰富,NSSM可能通过间接手段(如在服务启动脚本中设置限制)或利用特定API(如果存在)来尝试实现对服务资源使用的一定控制。

  NSSM通过与Windows操作系统底层服务管理接口的紧密集成,提供了一种简便的方法来封装和管理服务,同时增加了额外的监控、日志和恢复功能,使得普通应用程序能够以更加健壮和可控的方式作为服务运行。

NSSM(Non-Sucking Service Manager)的架构设计围绕着几个核心组件和它们之间的交互,以实现将普通应用程序作为Windows服务高效、灵活地管理。虽然NSSM的具体内部架构细节没有详细的官方文档,但基于其功能和工作原理,我们可以概述其主要组成部分和工作流程:

  1. 用户界面层:

    • 图形界面: NSSM提供了一个简单的图形用户界面(GUI),使得用户可以通过直观的操作来安装、配置、管理服务。用户可以在这个界面上设置服务名称、路径、参数、日志选项、恢复策略等。
    • 命令行界面: 除了GUI,NSSM还支持丰富的命令行参数,这使得通过脚本自动化服务管理变得可能。所有图形界面的功能都可以通过命令行指令来完成,便于集成到自动化部署流程中。
  2. 服务注册与配置引擎:

    • 该组件负责与Windows Service Control Manager (SCM) 交互,完成服务的注册、配置更新、启动、停止等操作。它使用Windows API(如CreateServiceChangeServiceConfig)来实现服务的生命周期管理。
  3. 进程监控与管理模块:

    • 一旦服务被启动,NSSM通过单独的监控进程来跟踪服务主进程的运行状态。这个模块会检测服务是否意外终止,并根据配置的策略(如自动重启、延时重启等)采取相应行动。它使用了进程间通信(IPC)机制和事件监听来实现监控。
  4. 日志与输出重定向系统:

    • NSSM能够捕获服务进程的标准输出和错误输出,并将其重定向到文件。这部分通过创建匿名管道 (CreatePipe) 和设置标准句柄 (SetStdHandle) 实现,同时也支持日志文件的自动滚动和归档。
  5. 资源与权限管理:

    • NSSM允许配置服务运行时的环境变量、工作目录以及使用特定用户账户。这部分通过修改服务的启动配置和使用相应的API调用来实施。
  6. 配置存储与加载:

    • NSSM使用配置文件(如config.ini)来存储服务的各种配置信息。每次服务启动时,这些配置会被加载并应用于服务进程。这使得服务的配置可以持久化且易于管理。

 NSSM构建了一个轻量级但功能强大的框架,它通过上述组件的协同工作,实现了服务的便捷管理、灵活配置、稳定运行以及故障恢复,从而满足了不同应用场景的需求。

学习和应用NSSM(Non-Sucking Service Manager)来管理Windows服务,可以遵循以下初级大纲进行实践:

1. 理论基础

  • 理解服务管理概念:了解Windows服务的基本概念,服务与普通应用程序的区别,以及服务的生命周期管理。

    理解服务管理概念涉及到 Windows 服务的基本概念、与普通应用程序的区别,以及服务的生命周期管理。

    1. Windows 服务的基本概念

    • 定义:Windows 服务是在后台运行的长期运行的应用程序,它们不会像普通应用程序那样由用户手动启动和停止。相反,它们通常在系统启动时自动启动,并在系统关闭时自动停止。

    • 作用:服务通常提供后台功能或系统级功能,例如网络通信、打印服务、数据库服务、安全功能等。它们可以在用户登录之前或之后启动,并且无需用户交互就可以运行。

    2. 服务与普通应用程序的区别

    • 启动方式

      • 普通应用程序:通常由用户手动启动。
      • 服务:通常在系统启动时自动启动。
    • 交互性

      • 普通应用程序:通常需要用户交互,如界面操作或用户输入。
      • 服务:通常不直接与用户交互,运行在后台。
    • 权限

      • 普通应用程序:通常在用户的上下文中运行,具有用户授予的权限。
      • 服务:通常在系统账户或指定的服务账户下运行,具有较高的权限,例如可以访问系统资源和执行特定的系统任务。
    • 生命周期

      • 普通应用程序:用户手动启动和停止,生命周期由用户控制。
      • 服务:通常在系统启动时启动,直到系统关闭或服务被停止。

    3. 服务的生命周期管理

    Windows 服务的生命周期通常包括以下状态:

    • Stopped(已停止):服务未运行。
    • Start Pending(启动挂起):服务正在启动过程中。
    • Running(运行中):服务正在正常运行。
    • Stop Pending(停止挂起):服务正在停止过程中。
    • Paused(已暂停):服务已经暂停,但可以恢复。
    • Pause Pending(暂停挂起):服务正在暂停过程中。
    • Continue Pending(继续挂起):服务正在恢复运行过程中。

    服务的管理工具(如服务管理器、命令行工具)允许管理员查看和控制服务的状态,例如启动、停止、暂停和恢复操作。服务的配置信息通常包括启动类型(自动、手动、禁用)、依赖关系和安全设置等。

    总结

    Windows 服务是一种在后台运行、无需用户交互、自动启动的长期运行应用程序,通常用于提供系统级别的功能和服务。了解服务管理概念包括理解其与普通应用程序的区别,以及掌握服务的生命周期管理方法,对于系统管理员和开发人员来说是重要的技能之一。

  • NSSM简介:掌握NSSM的功能特点,如服务安装、监控、日志重定向、故障恢复等。

    NSSM(Non-Sucking Service Manager)是一个开源的工具,用于将任意可执行程序(如应用程序、脚本等)转换为 Windows 服务。它提供了一些有用的功能,使得在 Windows 上管理和运行服务更加方便和灵活。

    主要功能特点包括:

    1. 服务安装和管理

      • 安装服务:通过 NSSM,你可以将任何可执行文件或脚本转换为 Windows 服务。安装过程简单,可以通过命令行完成。
        bashCopy Code
        nssm install ServiceName "C:\path\to\executable.exe"
      • 启动和停止服务:一旦安装完成,可以使用 NSSM 来启动、停止和重启服务。
        bashCopy Code
        nssm start ServiceName
        nssm stop ServiceName
    2. 监控和控制

      • 自动重启:NSSM 支持配置服务在崩溃或异常退出时自动重启,以确保服务的持续可用性。
        bashCopy Code
        nssm set ServiceName AppExit Restart
      • 性能和状态监控:虽然 NSSM 本身不提供详细的性能监控功能,但可以结合其他监控工具来实现对服务的监控。
    3. 日志重定向

      • 标准输出和错误输出:NSSM 允许将服务的标准输出和标准错误输出重定向到文件,以便更方便地查看服务的日志和调试信息。
        bashCopy Code
        nssm set ServiceName AppStdout "C:\path\to\stdout.log"
        nssm set ServiceName AppStderr "C:\path\to\stderr.log"
    4. 故障恢复

      • 重试和延迟:可以配置 NSSM 在服务启动失败时自动重试,并设置重试的延迟时间。
        bashCopy Code
        nssm set ServiceName AppRetry DelayInSeconds
    5. 其它功能

      • 环境变量管理:可以设置服务运行时所需的环境变量。
        bashCopy Code
        nssm set ServiceName AppEnvironmentVariable "value"

    使用 NSSM 的优势:

    • 简化管理:通过 NSSM,管理和监控服务变得更加直观和便捷,特别是对于那些没有自带服务支持的应用程序。
    • 灵活性:NSSM 支持多种配置选项,如重定向输出、故障恢复和环境变量设置,使得能够更好地适应不同的部署需求。
    • 开源免费:作为开源工具,NSSM 提供了免费使用的权利,并且有活跃的社区支持和更新。

    总之,NSSM 是一个强大的工具,适用于将各种应用程序转换为 Windows 服务,并提供了多种配置选项和管理功能,使得服务的安装、运行和监控变得更加高效和可靠。

2. 准备工作

  • 下载与安装NSSM:从官方GitHub仓库或其他可信源获取NSSM的最新版本,熟悉其免安装特性。
  • 选择测试应用:挑选一个简单的可执行程序或脚本作为实验对象,例如一个命令行打印“Hello World”的批处理文件。

3. 使用NSSM安装服务

  • 命令行安装

    • 打开命令提示符(CMD)或PowerShell(以管理员身份运行)。
    • 使用nssm install [服务名]命令开始安装过程。
      1. 安装服务: 使用以下命令格式来安装服务:

        Copy Code
        nssm install [服务名] [程序路径] [可选参数]
        • [服务名]:你想要给服务取的名称。
        • [程序路径]:要安装为服务的可执行文件的路径。
        • [可选参数]:可选的参数,如启动类型、工作目录等。

        例如:

        Copy Code
        nssm install MyService "C:\Path\To\Your\Executable.exe"

        这将安装一个名为 MyService 的服务,服务的可执行文件是 C:\Path\To\Your\Executable.exe

      2. 配置服务: 安装服务后,NSSM 会打开一个界面,让你配置服务的详细信息,包括服务的启动类型(自动、手动、禁用)、服务的描述等。按照提示填写完毕后,点击确定保存配置。

      3. 启动服务: 安装完成后,你可以通过以下命令来启动服务:

        Copy Code
        net start [服务名]

        例如:

        Copy Code
        net start MyService

        这将启动名为 MyService 的服务。

      4. 验证服务状态: 使用以下命令来验证服务的当前状态:

        Copy Code
        sc query [服务名]

        或者使用 NSSM 的界面来查看服务的状态和管理服务。

      5. 卸载服务: 如果需要卸载服务,可以使用以下命令:

        Copy Code
        nssm remove [服务名]

        例如:

        Copy Code
        nssm remove MyService

        这将从系统中移除名为 MyService 的服务配置。

      通过这些步骤,你可以使用 NSSM 将任何可执行文件安装为 Windows 服务,并进行管理。

    • 指定服务的可执行文件路径、参数、工作目录等。

      在使用 NSSM 安装 Windows 服务时,你可以指定服务的可执行文件路径、参数、工作目录等详细配置。以下是如何使用 NSSM 命令来指定这些参数的示例:

      1. 指定可执行文件路径

      要安装服务,首先需要指定要安装的可执行文件的路径。假设你的可执行文件位于 C:\Path\To\Your\Executable.exe,可以使用以下命令:

      bashCopy Code
      nssm install MyService "C:\Path\To\Your\Executable.exe"

      这将安装一个名为 MyService 的服务,服务的可执行文件是 C:\Path\To\Your\Executable.exe

      2. 指定参数

      如果你的可执行文件需要命令行参数,你可以在安装服务时通过 AppParameters 参数来指定。例如,如果你的可执行文件需要一个参数 -mode demo,可以这样安装服务:

      bashCopy Code
      nssm install MyService "C:\Path\To\Your\Executable.exe" "-mode demo"

      这样安装后,服务启动时会自动传递 -mode demo 参数给可执行文件。

      3. 指定工作目录

      有时候可执行文件需要在特定的工作目录中运行。你可以使用 AppDirectory 参数来指定服务的工作目录。例如,如果你希望服务在 D:\WorkDirectory 中运行,可以这样安装服务:

      bashCopy Code
      nssm install MyService "C:\Path\To\Your\Executable.exe"
      nssm set MyService AppDirectory "D:\WorkDirectory"

      这样安装后,服务在启动时会先切换到 D:\WorkDirectory 目录。

      4. 其他配置

      除了上述的基本配置外,NSSM 还支持许多其他配置选项,如服务的启动类型(Start)、服务的描述(Description)、服务的依赖关系(DependOnService)、服务的显示名称(DisplayName)等。你可以通过 nssm set 命令来配置这些选项。

      例如,设置服务的描述:

      bashCopy Code
      nssm set MyService Description "This is a sample service"

      5. 示例总结

      综合起来,一个完整的安装命令可能如下所示,包括可执行文件路径、参数和工作目录的指定:

      bashCopy Code
      nssm install MyService "C:\Path\To\Your\Executable.exe" "-mode demo"
      nssm set MyService AppDirectory "D:\WorkDirectory"
      nssm set MyService Description "This is a sample service"

      通过这些命令,你可以灵活地配置和管理 Windows 服务的安装过程,以适应各种需求和场景。

    • 配置服务的启动类型(自动、手动、禁用)和恢复选项。

      使用 NSSM 命令配置服务的启动类型(自动、手动、禁用)和恢复选项是很简单的。下面是如何通过 NSSM 来设置这些选项的示例:

      1. 设置启动类型

      NSSM 使用 start 参数来设置服务的启动类型。以下是几种常见的启动类型:

      • Automatic:服务会在系统启动时自动启动。
      • Manual:服务不会自动启动,需要手动启动。
      • Disabled:服务被禁用,不会启动。

      设置服务自动启动

      bashCopy Code
      nssm set MyService Start SERVICE_AUTO_START

      这将使名为 MyService 的服务在系统启动时自动启动。

      设置服务手动启动

      bashCopy Code
      nssm set MyService Start SERVICE_DEMAND_START

      这将使名为 MyService 的服务需要手动启动。

      禁用服务自动启动

      bashCopy Code
      nssm set MyService Start SERVICE_DISABLED

      这将禁用名为 MyService 的服务,使其无法启动。

      2. 设置恢复选项

      NSSM 允许配置服务的恢复选项,以便在服务失败时自动尝试恢复或执行其他操作。以下是几个常见的恢复选项:

      设置服务的恢复动作

      NSSM 使用 failure 参数来配置服务的恢复选项。例如,设置服务在失败后重启:

      bashCopy Code
      nssm set MyService FailureActions restart/5000

      这将使名为 MyService 的服务在失败后等待 5000 毫秒(5 秒)后尝试重启。

      禁用服务的恢复动作

      如果你不希望服务在失败后进行任何恢复动作,可以将恢复选项设置为空:

      bashCopy Code
      nssm set MyService FailureActions ""

      这将禁用名为 MyService 的服务的任何恢复动作。

      示例总结

      综合起来,一个完整的设置服务启动类型和恢复选项的示例可能如下所示:

      bashCopy Code
      nssm set MyService Start SERVICE_AUTO_START
      nssm set MyService FailureActions restart/5000

      通过这些命令,你可以根据实际需求配置和管理 Windows 服务的启动类型和恢复选项,确保服务在系统中正确地运行和恢复。

    • 完成后,查看服务是否已成功添加到Windows服务列表中。
  • 图形界面安装(可选):

    • 启动NSSM GUI,浏览并选择你的应用程序。
    • 通过图形界面填写服务名称、路径、参数等信息。
    • 应用设置并安装服务。

4. 服务管理与监控

  • 启动与停止服务:通过服务管理器或命令行(如net start [服务名]net stop [服务名])操作服务。
  • 查看服务状态:使用sc query [服务名]或服务管理器查看服务是否按预期运行。
  • 日志查看:定位NSSM配置的日志文件,检查服务运行时的输出信息。

5. 故障恢复与高级配置

  • 配置自动重启策略:通过NSSM设置服务在崩溃后的自动重启规则。

    要通过 NSSM 设置服务在崩溃后的自动重启规则,可以使用 NSSM 提供的 failure 参数。这允许你指定服务在发生故障或崩溃时的行为,包括重启服务、重新启动计算机等选项。

    配置自动重启规则示例:

    设置服务在崩溃后自动重启

    bashCopy Code
    nssm set MyService FailureActions restart/5000/restart/60000/restart/600000
    • restart/5000: 表示服务在失败后等待 5000 毫秒(5 秒)后尝试重启。
    • restart/60000: 表示服务在第一次失败后再等待 60000 毫秒(1 分钟)后尝试重启。
    • restart/600000: 表示服务在第二次失败后再等待 600000 毫秒(10 分钟)后尝试重启。

    这个示例设置了服务在崩溃后的自动重启策略,每次失败后会等待不同的时间间隔后尝试重启。你可以根据实际需求调整这些时间间隔。

    清除服务的重启策略

    如果你希望清除服务的重启策略(即禁用自动重启),可以将 FailureActions 参数设置为空字符串:

    bashCopy Code
    nssm set MyService FailureActions ""

    这将禁用名为 MyService 的服务在崩溃后的任何自动重启行为。

    注意事项:

    • 时间间隔单位:重启策略中指定的时间间隔是以毫秒为单位的。
    • 多次重启策略:可以指定多个 restart/delay 来定义多个重启动作,每个 restart/delay 表示一次重启动作及其延迟。

    通过上述 NSSM 命令,你可以有效地管理和配置 Windows 服务在崩溃或失败后的自动重启策略,确保服务能够在故障后自动恢复。

  • 资源限制与用户账户:尝试配置服务运行时的资源限制和指定不同的运行账户。

    要使用 NSSM 命令来配置服务运行时的资源限制和指定不同的运行账户,你需要分别使用 CPUAffinity, CPUCount, CPUPriority, MemoryLimit, ObjectName, Start, UserName, Password 参数。这些参数可以帮助你限制服务的资源使用,并指定服务运行的用户账户。

    配置资源限制示例:

    1. 设置CPU亲和性和核心数限制:

    bashCopy Code
    nssm set MyService CPUAffinity 3
    nssm set MyService CPUCount 2
    • CPUAffinity 3: 将服务限制在 CPU 亲和性位图为 00000011,即只能在 CPU 0 和 CPU 1 上运行。
    • CPUCount 2: 将服务限制在最多使用 2 个 CPU 核心。

    2. 设置CPU优先级:

    bashCopy Code
    nssm set MyService CPUPriority 128
    • CPUPriority 128: 设置服务的 CPU 优先级为 128,具体数值的含义可以参考系统的文档或说明。

    3. 设置内存限制:

    bashCopy Code
    nssm set MyService MemoryLimit 2048
    • MemoryLimit 2048: 设置服务的内存限制为 2048 MB。

    配置用户账户示例:

    1. 指定服务运行的用户名和密码:

    bashCopy Code
    nssm set MyService ObjectName "DOMAIN\username"
    nssm set MyService Start SERVICE_AUTO_START
    nssm set MyService Password "password"
    • ObjectName "DOMAIN\username": 指定服务运行的用户名。替换 DOMAIN\username 为实际的域名和用户名。
    • Password "password": 设置服务的密码。这是可选的,取决于服务需要身份验证的配置。

    注意事项:

    • 在设置用户名和密码时,确保提供正确的域名和用户名,并且密码需要符合安全要求。
    • 在设置资源限制时,确保了解服务的需求和系统的硬件配置,避免设置过度或不足的资源限制。

    通过这些 NSSM 命令,你可以有效地配置 Windows 服务的资源限制和指定服务运行的用户账户,以满足安全性、性能和应用程序需求。

  • 高级日志配置:调整日志文件的大小限制、轮转策略等。

    要通过 NSSM 命令进行高级日志配置,包括调整日志文件的大小限制和轮转策略,你可以使用 AppStdout, AppStderr, AppRotateFiles, AppRotateOnline, AppRotateBytes, AppRotatePeriod 参数。这些参数允许你配置服务的标准输出和错误日志文件,以及定义日志的轮转方式。

    配置日志文件大小限制和轮转策略示例:

    1. 设置标准输出和错误日志文件路径:

    bashCopy Code
    nssm set MyService AppStdout "C:\path\to\stdout.log"
    nssm set MyService AppStderr "C:\path\to\stderr.log"
    • AppStdout "C:\path\to\stdout.log": 设置服务的标准输出日志文件路径。
    • AppStderr "C:\path\to\stderr.log": 设置服务的标准错误日志文件路径。

    2. 配置日志轮转方式:

    按文件大小轮转:
    bashCopy Code
    nssm set MyService AppRotateFiles 10
    nssm set MyService AppRotateBytes 10485760
    • AppRotateFiles 10: 设置最多保留 10 个日志文件。
    • AppRotateBytes 10485760: 设置每个日志文件的最大大小为 10 MB(10485760 字节)。
    按时间轮转:
    bashCopy Code
    nssm set MyService AppRotateOnline
    nssm set MyService AppRotatePeriod 1
    • AppRotateOnline: 启用在线轮转,即根据时间进行轮转。
    • AppRotatePeriod 1: 设置每天轮转一次日志。

    注意事项:

    • 确保日志文件路径存在并且服务账户有权限写入这些路径。
    • 轮转参数的设置应根据服务的日志生成速率和存储需求来调整,以避免日志文件过大或过多。

    通过这些 NSSM 命令,你可以灵活地配置 Windows 服务的日志记录设置,包括输出日志文件路径、日志轮转的大小限制和周期,以满足应用程序的日志管理需求。

6. 实践与故障排除

  • 模拟故障:故意使服务崩溃或遇到错误,观察NSSM是否按预期重启服务。

    要模拟故障以测试 NSSM 是否能按预期重启服务,可以通过以下步骤进行:

    1. 创建一个故障的脚本或程序

      • 创建一个简单的脚本或程序,使其出现故障或异常情况。例如,一个简单的脚本可以是 Python 脚本,意外地退出或抛出异常。
      pythonCopy Code
      # faulty_script.py
      import sys
      
      def main():
          print("Service is starting...")
          # Simulate an error condition
          sys.exit(1)
      
      if __name__ == "__main__":
          main()
    2. 安装服务并配置 NSSM

      • 使用 NSSM 将该脚本或程序安装为一个 Windows 服务,并配置 NSSM,确保服务以自动启动模式运行。
      bashCopy Code
      nssm install MyFaultyService "C:\Python39\python.exe" "C:\path\to\faulty_script.py"
      nssm set MyFaultyService AppStdout "C:\path\to\stdout.log"
      nssm set MyFaultyService AppStderr "C:\path\to\stderr.log"
      nssm set MyFaultyService Start SERVICE_AUTO_START
    3. 启动服务

      • 使用 NSSM 启动该服务:
      bashCopy Code
      nssm start MyFaultyService
    4. 观察服务行为

      • 监视服务是否如预期般运行,并且在故障发生时是否触发了 NSSM 的重启机制。
    5. 模拟故障

      • 修改脚本或程序,使其故意失败或引发异常,例如修改 faulty_script.py 让其调用一个未定义的函数或者试图读取不存在的文件等。
      pythonCopy Code
      # modified faulty_script.py
      import sys
      
      def main():
          print("Service is starting...")
          # Simulate an error condition
          some_undefined_function()
      
      if __name__ == "__main__":
          main()
    6. 观察 NSSM 的行为

      • 当服务因故障而退出时,NSSM 应该会检测到服务的退出,并根据配置的重启策略尝试重新启动服务。

    通过这些步骤,你可以验证 NSSM 是否能够有效地监控服务状态,并在服务故障时按照预期的方式重启服务。

  • 日志分析:利用日志信息诊断服务运行时的问题。
  • 问题解决:针对遇到的安装、运行或配置问题,查阅NSSM文档或社区论坛寻求解决方案。

7. 总结与进阶

  • 回顾学习成果:总结NSSM的基本用法和实践经验。
  • 探索高级功能:了解如何使用NSSM进行更复杂的服务配置和优化。
  • 持续学习:关注NSSM的更新动态,学习新的特性和最佳实践。

通过以上步骤,你可以从零开始掌握NSSM的基本应用,为进一步深入服务管理领域打下坚实的基础。

对于已经掌握了NSSM基础应用的用户,中级应用大纲旨在进一步深化对NSSM的理解和运用,涉及更复杂的配置、故障排查以及自动化管理。以下是NSSM中级应用的学习大纲:

1. 高级服务配置与优化

  • 服务性能调优:学习如何根据服务负载调整服务优先级、内存分配等,以提高服务运行效率。

    调优 NSSM 或任何服务的性能可以通过多种方法来实现,包括调整服务的优先级、内存分配以及其他相关的操作系统级别的参数。下面是一些常见的性能调优策略:

    1. 调整服务优先级

    服务的优先级决定了操作系统在分配 CPU 时间和其他资源时对其重要性的权重。通过调整服务的优先级,可以确保其在系统负载高时仍能获得足够的资源。

    • Windows 上的优先级设置:可以使用 Windows 任务管理器或命令行工具(如 wmic)来修改服务的优先级。
      bashCopy Code
      wmic process where name="your_service_name.exe" CALL setpriority "priority_level"
      这里的 priority_level 可以是从 0 (最低优先级)到 31 (最高优先级)的整数。
    • 在 Windows 上,你可以使用 PowerShell 来修改服务的优先级。这里有一些示例命令和步骤:

      使用 PowerShell 修改服务优先级

      1. 查找服务进程的 PID(进程ID): 首先,需要找到你想要修改优先级的服务的进程ID。可以通过以下 PowerShell 命令找到:

        powershellCopy Code
        Get-Process -Name "your_service_name" | Select-Object -Property Name, Id

        "your_service_name" 替换为你服务的实际名称。

      2. 修改服务进程的优先级: 一旦获得了服务的进程ID,你可以使用 Get-ProcessStart-Process 命令来修改服务的优先级。

        • 通过 Get-Process 和 Start-Process 设置优先级
          powershellCopy Code
          $process = Get-Process -Name "your_service_name"
          $process.PriorityClass = [System.Diagnostics.ProcessPriorityClass]::High
          这里将 "your_service_name" 替换为你服务的实际名称。High 可以替换为 IdleBelowNormalNormalAboveNormalHigh, 或 RealTime,分别对应不同的优先级。

      示例

      假设要将名为 MyService.exe 的服务的优先级设置为高(High),可以这样操作:

      powershellCopy Code
      $process = Get-Process -Name "MyService"
      $process.PriorityClass = [System.Diagnostics.ProcessPriorityClass]::High

      请注意,修改服务的优先级可能需要管理员权限,因此请以管理员身份运行 PowerShell。

      注意事项

      • 安全性和稳定性:修改服务的优先级可能会影响系统稳定性和其他正在运行的服务。确保在生产环境中谨慎操作,并评估可能的影响。
      • 持久性:服务的优先级通常在服务重新启动后会重置为默认值。如果需要持久性的优先级设置,可能需要通过其他手段实现。

      通过这些步骤,你可以在 Windows 上使用 PowerShell 轻松地修改服务的优先级,以优化系统资源分配和服务性能。

    2. 调整内存分配

    合理的内存分配对于服务的性能至关重要。确保服务有足够的内存可以避免因内存不足而导致的性能下降或崩溃。

    • 调整工作集大小:工作集是服务在内存中驻留的部分,可以通过操作系统的设置或服务自身的配置进行调整。
    • 虚拟内存设置:如果服务需要大量内存,可以增加操作系统的虚拟内存大小,以支持服务的内存需求。

    3. 硬件资源调整

    除了操作系统级别的调整外,还可以考虑硬件资源的优化,如 CPU 和磁盘的性能优化,以支持服务的高效运行。

    • CPU 亲和性设置:在多核系统上,可以通过设置 CPU 亲和性,将服务限制在特定的 CPU 核心上运行,以提高性能和稳定性。
    • 磁盘性能优化:确保服务的数据访问速度快,可以考虑使用 SSD 硬盘或者 RAID 阵列来提高磁盘性能。

    4. 监控和优化

    性能调优不是一次性的任务,而是一个持续的过程。因此,建议实施监控和优化策略来持续跟踪服务的性能表现,并根据需要进行调整。

    • 性能监控工具:使用工具如 Windows 性能监视器(Performance Monitor)、第三方监控工具或服务自身的性能监控功能来监测关键指标。
    • 优化周期:定期评估服务的性能,并根据监控数据制定优化策略,以确保服务在各种负载情况下都能稳定运行。

    实施步骤

    1. 分析当前性能:使用性能监控工具分析服务的当前性能表现,识别可能的瓶颈。
    2. 制定优化策略:基于分析结果,制定具体的优化策略,包括调整优先级、内存分配等。
    3. 实施调整:根据策略调整操作系统和服务配置。
    4. 监控效果:部署调整后,持续监控服务的性能变化,评估优化效果并进行必要的调整。

    通过这些方法,可以有效地提升 NSSM 或其他服务的性能,使其能够更高效、更稳定地运行,满足用户和业务的需求。

  • 环境变量定制:深入了解如何为服务配置特定的环境变量,以适应不同应用程序的需求。
  • 高级日志管理:配置日志文件的自定义命名规则、归档策略,以及使用事件查看器集成。

2. 高可用性与容错策略

  • 高级故障恢复策略:设计并实施复杂的故障恢复方案,包括但不限于自定义重启延迟、尝试次数限制、故障转移策略。

    设计和实施复杂的故障恢复方案对于确保服务的高可用性至关重要。下面是一些高级故障恢复策略,特别适用于 NSSM 或类似服务的环境:

    1. 自定义重启延迟

    在 NSSM 的配置中,可以设置自定义的重启延迟,以确保在服务异常退出后不会立即重启,避免过于频繁的重启尝试。这可以通过 NSSM 的参数或脚本实现,例如:

    • 重启延迟策略:在服务退出后,等待一段时间再尝试重启。这段时间可以是固定的,也可以根据前几次尝试的失败情况动态调整。

    2. 尝试次数限制

    设置重启尝试次数的限制,避免无限制地尝试重启可能已经失效的服务。这可以通过监控工具或者在 NSSM 的配置中实现:

    • 最大重启次数:限制 NSSM 尝试重启服务的次数。如果超过设定的次数,可以触发后续的故障转移策略或通知管理员进行手动干预。

    3. 故障转移策略

    在故障无法通过自动重启解决时,采取故障转移策略是保证服务可用性的重要手段。这包括:

    • 服务切换到备用节点:如果有多个节点或副本,当主节点出现问题时,自动切换到备用节点提供服务。
    • 负载均衡器重新路由:在有负载均衡器的环境中,当主服务失效时,负载均衡器可以自动将流量转发到可用节点。

    4. 健康检查和自动恢复

    实施健康检查机制,定期监测服务的状态和性能。当检测到服务异常或性能下降时,可以自动触发恢复措施,如:

    • 自动从备份恢复数据:如果服务依赖于数据,可以自动从备份中恢复数据以确保服务的连续性。
    • 重新初始化服务配置:在某些情况下,服务的配置可能会导致问题,可以自动重新初始化配置。

    5. 警报和通知机制

    设置实时的警报和通知机制,及时通知运维团队或管理员,以便他们可以快速响应问题。这包括:

    • 监控工具集成:将监控工具与警报系统集成,基于预定义的阈值触发警报。
    • 多通道通知:通过电子邮件、短信或集成到团队通讯工具(如Slack或Microsoft Teams)发送警报。

    实施步骤

    1. 分析和规划:理解服务的关键依赖和故障恢复需求。
    2. 配置 NSSM:根据需求配置 NSSM 的参数,包括重启延迟、尝试次数等。
    3. 集成监控:选择适当的监控工具,并配置监控项和警报规则。
    4. 实施故障转移策略:设计和实施故障转移策略,确保在主服务失效时能快速切换到备用服务。
    5. 测试和优化:定期测试和优化故障恢复方案,确保其在实际场景中的有效性和可靠性。

    通过这些高级故障恢复策略,可以显著提高 NSSM 或类似服务的稳定性和可用性,确保系统能够在面对各种故障和异常情况时保持高效运行。

  • 资源监控与自我保护:利用外部监控工具结合NSSM,实现实时资源监控,预防服务因资源耗尽而崩溃。

    要利用外部监控工具与 NSSM 结合,实现实时资源监控和自我保护,以预防服务因资源耗尽而崩溃,可以采取以下策略和步骤:

    1. 选择合适的监控工具

    选择一个适合的外部监控工具,可以监控系统资源如内存、CPU 使用率,以及特定服务的运行状态和资源消耗情况。一些常见的监控工具包括:

    • Prometheus + Grafana:用于指标监控和数据可视化。
    • Zabbix:全面的监控解决方案,支持自定义监控项和告警设置。
    • Nagios:强大的监控和警报系统,适用于复杂的监控场景。
    • Windows Performance Monitor:Windows 自带的性能监控工具,可以监视各种系统资源。

    2. 配置监控项和警报规则

    在监控工具中配置监控项,监视 NSSM 服务的关键指标,例如:

    • CPU 使用率
    • 内存使用
    • 磁盘空间
    • 服务状态

    根据服务的特性,可能还需要监控特定的自定义指标,例如服务处理的请求数、数据库连接池状态等。

    设置警报规则,当监控指标超过预设阈值时触发警报。例如,CPU 使用率超过 90% 或内存使用超过 80% 可能表明服务即将耗尽资源。

    3. 配置自动响应和自我保护机制

    一旦监控工具检测到异常情况(如资源耗尽),应该自动触发响应机制,以保护 NSSM 服务的稳定性和系统的整体性能。常见的自我保护措施包括:

    • 自动重启服务:通过监控工具或编写脚本,当服务异常时自动尝试重启服务,恢复正常运行。
    • 资源限制和控制:通过操作系统的资源管理功能,如 Windows 的工作进程限制(Job Objects)或 Linux 的 cgroups,限制服务使用的资源上限,避免耗尽系统资源。
    • 警报通知和手动干预:设置警报通知,通知运维团队或管理员进行手动干预,确保及时处理问题。

    4. 定期评估和优化

    监控和自我保护机制需要定期评估和优化,以应对不断变化的服务和系统环境。根据监控数据和实际运行情况,调整监控阈值、警报规则和自我保护策略,以提高系统的稳定性和可靠性。

    通过以上步骤,结合外部监控工具和 NSSM 的自我保护功能,可以有效地预防 NSSM 服务因资源耗尽而崩溃,保证服务的可用性和稳定性。

3. 安全与权限管理

  • 服务账户安全:深入理解不同服务账户类型(如Local System, Network Service, Local Service等)的权限差异,合理配置服务账户以增强安全性。

    配置 NSSM 服务时,选择合适的服务账户类型是确保安全性和功能性的重要一步。以下是几种常见的 Windows 服务账户类型及其权限特点:

    1. Local System

    • 权限特点

      • 最高权限的服务账户之一,通常拥有本地计算机上几乎所有资源的完全控制权限。
      • 可以访问网络资源,但只以计算机账户身份而非用户身份。
      • 适用于需要完全控制权限且无需网络资源用户身份的服务。
    • 使用场景

      • 独立运行、需要完整访问计算机资源的服务。
      • 不需要网络资源用户身份(如不需要访问网络共享文件或打印机)。

    2. Network Service

    • 权限特点

      • 拥有较高的本地系统资源访问权限,但受到一定限制以增强安全性。
      • 可以作为网络账户身份访问网络资源,例如访问共享文件夹。
    • 使用场景

      • 需要访问网络资源(如共享文件夹)且不需要本地系统上的最高权限。
      • 比 Local System 更安全但仍需要一定的系统资源访问权限的服务。

    3. Local Service

    • 权限特点

      • 拥有较低的系统权限,通常限于本地计算机上的资源访问。
      • 不具备访问网络资源的能力,只能以本地计算机账户的身份进行操作。
    • 使用场景

      • 需要访问本地系统资源,但不需要网络资源访问。
      • 安全性要求较高且服务不需要网络连接的情况。

    如何选择服务账户类型?

    • 安全性考量:根据服务需要的权限,选择最低权限的服务账户类型,以限制服务对系统和网络资源的访问范围,从而减少潜在的安全风险。
    • 功能需求:确保选择的账户类型能够满足服务的功能需求,例如是否需要访问网络资源或执行特定的系统操作。

    配置 NSSM 服务账户类型

    在使用 NSSM 安装或配置服务时,可以通过 nssm set 命令来指定服务的账户类型。例如:

    bashCopy Code
    nssm.exe set MyService AppRotate 1
    nssm.exe set MyService AppStdout "C:\Logs\MyService.log"
    nssm.exe set MyService AppStderr "C:\Logs\MyService_err.log"
    nssm.exe set MyService ObjectName "NT AUTHORITY\NetworkService"

    在这个例子中,通过设置 ObjectName 参数为 "NT AUTHORITY\NetworkService",将服务配置为使用 Network Service 账户运行。

    总结来说,选择合适的服务账户类型有助于提高服务的安全性和功能性,确保服务运行在最小必要权限的前提下,同时满足其功能需求。

  • 服务权限与ACL:配置访问控制列表(ACL),精细控制服务的访问权限,防止未授权访问。

    要通过 ACL(Access Control List,访问控制列表)精细控制 NSSM 服务的访问权限,可以采取以下步骤:

    1. 确定服务账户

    首先,要了解 NSSM 服务所使用的服务账户,这决定了你需要配置 ACL 的对象。

    • Local System:如果 NSSM 服务使用 Local System 账户,则 ACL 将应用于该账户。
    • Network Service 或 Local Service:类似地,根据 NSSM 服务使用的账户类型来确定 ACL 的对象。

    2. 设置ACL

    使用 Windows 的命令行工具或 GUI 工具来设置 ACL。下面是一些常用的方法:

    使用命令行工具(icacls)

    可以使用 icacls 命令来配置 ACL。例如,假设你要控制服务文件夹的权限:

    bashCopy Code
    icacls "C:\Path\To\ServiceFolder" /grant "NT AUTHORITY\NetworkService:(RX)"

    这个命令将授予 Network Service 账户对指定文件夹的读取和执行权限。

    使用Windows GUI

    1. 属性窗口

      • 右键单击文件夹或文件,选择 "属性"。
      • 在 "安全" 标签中,点击 "编辑"。
      • 在 "选择用户或组" 对话框中输入服务账户名称,然后配置所需的权限。
    2. 高级安全设置

      • 在 "安全" 标签中,点击 "高级"。
      • 在 "高级安全设置" 对话框中,点击 "添加"。
      • 输入服务账户名称,配置所需的详细权限,如读取、写入、执行等。

    3. 配置详细权限

    确保根据服务的实际需求,配置详细的权限,包括但不限于:

    • 读取
    • 写入
    • 执行
    • 修改
    • 完全控制

    根据安全最佳实践,应该尽可能限制权限,以防止未授权的访问和操作。

    4. 测试和验证

    完成 ACL 设置后,确保测试 NSSM 服务的功能性和访问权限。可以通过尝试访问服务应该具备的资源来验证权限设置是否有效。

    通过这些步骤,可以有效地使用 ACL 精细控制 NSSM 服务的访问权限,以确保系统安全性和服务的正常运行。

4. 自动化与脚本编写

  • 批处理与PowerShell脚本:编写脚本以自动化NSSM的常见任务,如批量安装、配置服务、状态检查等。

    展示如何使用批处理(.bat文件)和 PowerShell 脚本来自动化 NSSM(Non-Sucking Service Manager)的常见任务,包括批量安装、配置服务和状态检查。

    1. 批处理脚本(.bat)

    批量安装服务

    以下示例演示如何使用批处理脚本批量安装多个服务。

    Copy Code
    @echo off
    
    rem 定义服务名称和可执行文件路径
    set "service1=Service1"
    set "exe1=C:\Path\To\Service1.exe"
    set "service2=Service2"
    set "exe2=C:\Path\To\Service2.exe"
    
    rem 安装服务1
    nssm install "%service1%" "%exe1%"
    
    rem 安装服务2
    nssm install "%service2%" "%exe2%"
    
    echo 所有服务已安装。
    pause

    配置服务

    以下示例演示如何配置已安装的服务。

    Copy Code
    @echo off
    
    rem 定义服务名称和需要配置的参数
    set "service1=Service1"
    set "service2=Service2"
    
    rem 配置服务1
    nssm set "%service1%" AppDirectory "C:\Path\To\Service1\Directory"
    nssm set "%service1%" AppParameters "-param1 value1 -param2 value2"
    
    rem 配置服务2
    nssm set "%service2%" AppDirectory "C:\Path\To\Service2\Directory"
    nssm set "%service2%" AppParameters "-param3 value3 -param4 value4"
    
    echo 所有服务已配置。
    pause

    检查服务状态

    以下示例演示如何检查已安装服务的状态。

    Copy Code
    @echo off
    
    rem 定义服务名称
    set "service1=Service1"
    set "service2=Service2"
    
    rem 获取服务1的状态
    nssm status "%service1%"
    
    rem 获取服务2的状态
    nssm status "%service2%"
    
    pause

    2. PowerShell 脚本

    批量安装服务

    以下示例演示如何使用 PowerShell 脚本批量安装多个服务。

    powershellCopy Code
    # 定义服务名称和可执行文件路径
    $services = @{
        Service1 = "C:\Path\To\Service1.exe"
        Service2 = "C:\Path\To\Service2.exe"
    }
    
    foreach ($service in $services.GetEnumerator()) {
        $serviceName = $service.Key
        $exePath = $service.Value
    
        Start-Process -FilePath "nssm.exe" -ArgumentList "install $serviceName $exePath" -Wait
    }
    
    Write-Host "所有服务已安装。"

    配置服务

    以下示例演示如何配置已安装的服务。

    powershellCopy Code
    # 定义服务名称和需要配置的参数
    $services = @{
        Service1 = @{
            AppDirectory = "C:\Path\To\Service1\Directory"
            AppParameters = "-param1 value1 -param2 value2"
        }
        Service2 = @{
            AppDirectory = "C:\Path\To\Service2\Directory"
            AppParameters = "-param3 value3 -param4 value4"
        }
    }
    
    foreach ($service in $services.GetEnumerator()) {
        $serviceName = $service.Key
        $config = $service.Value
    
        foreach ($key in $config.Keys) {
            $value = $config[$key]
            Start-Process -FilePath "nssm.exe" -ArgumentList "set $serviceName $key $value" -Wait
        }
    }
    
    Write-Host "所有服务已配置。"

    检查服务状态

    以下示例演示如何检查已安装服务的状态。

    powershellCopy Code
    # 定义服务名称
    $services = "Service1", "Service2"
    
    foreach ($service in $services) {
        Start-Process -FilePath "nssm.exe" -ArgumentList "status $service" -Wait
    }

    注意事项:

    • 在使用这些脚本之前,请确保已经将 NSSM 工具(nssm.exe)放置在一个可以访问的路径下,并且脚本中正确引用了该工具的路径。
    • 这些示例假设 NSSM 已正确配置,并且可以在命令行或 PowerShell 中调用。

    通过这些脚本,你可以有效地自动化 NSSM 的安装、配置和状态检查过程,提高工作效率并减少手动操作的错误风险。

  • 持续集成/持续部署(CI/CD)集成:将NSSM操作集成到CI/CD流程中,实现服务自动部署与配置更新。

    集成 NSSM 到 CI/CD 流程中,实现服务的自动部署与配置更新,通常涉及以下几个步骤:

    1. 准备工作

    首先,确保在你的 CI/CD 环境中安装了 NSSM,并能够通过命令行或脚本调用它。NSSM 的可执行文件(nssm.exe)需要能够被 CI/CD 工具访问到。

    2. 编写部署脚本

    在 CI/CD 流程中,可以使用脚本(如批处理或 PowerShell)来执行 NSSM 的安装、配置和状态检查操作。以下是一个基本的示例:

    PowerShell 示例脚本

    powershellCopy Code
    # 定义服务名称和可执行文件路径
    $serviceName = "MyService"
    $exePath = "C:\Path\To\MyService.exe"
    $appDirectory = "C:\Path\To\MyService\Directory"
    $appParameters = "-param1 value1 -param2 value2"
    
    # 安装服务
    Start-Process -FilePath "nssm.exe" -ArgumentList "install $serviceName $exePath" -Wait
    
    # 设置服务的工作目录和参数
    Start-Process -FilePath "nssm.exe" -ArgumentList "set $serviceName AppDirectory $appDirectory" -Wait
    Start-Process -FilePath "nssm.exe" -ArgumentList "set $serviceName AppParameters $appParameters" -Wait
    
    # 启动服务(如果服务需要在安装后立即启动)
    Start-Service -Name $serviceName
    
    # 检查服务状态
    $status = (Get-Service -Name $serviceName).Status
    Write-Host "Service status: $status"

    3. 集成到 CI/CD Pipeline

    将以上脚本或类似的脚本集成到你的 CI/CD 流程中的一个步骤中,例如部署阶段或者一个专门的任务。具体集成方法取决于你使用的 CI/CD 工具,例如 Jenkins、GitLab CI/CD、Azure Pipelines 等。

    • Jenkins 示例: 在 Jenkins 的 Pipeline 中,你可以使用 bat 或 powershell 步骤来执行上述 PowerShell 脚本。
    groovyCopy Code
    pipeline {
        agent any
        
        stages {
            stage('Deploy') {
                steps {
                    powershell '''
                    # PowerShell 脚本内容
                    '''
                }
            }
        }
    }
    • GitLab CI/CD 示例: 在 .gitlab-ci.yml 文件中,使用 script 部分执行脚本。
    yamlCopy Code
    deploy:
      script:
        - powershell '''
          # PowerShell 脚本内容
          '''

    4. 触发与自动化

    通过 CI/CD 流程的触发器(例如代码提交、定时触发等),自动化执行部署脚本。确保在每次部署时,服务的安装、配置和状态都能得到正确管理和更新。

    5. 日志与监控

    在实施过程中,确保服务的部署和配置更新过程能够记录日志,并设置适当的监控和告警机制,以便及时发现和解决问题。

    通过这样的集成,你可以实现服务的快速部署和灵活的配置更新,提高开发和部署效率,同时确保服务的稳定性和可靠性。

5. 进阶故障排查

  • 深度日志分析:利用高级日志分析技巧,快速定位服务运行时的异常或性能瓶颈。
  • 调试服务应用:结合NSSM与应用程序自身的调试工具,进行更深层次的问题追踪与解决。

6. 实战案例分析

  • 案例研究:分析真实世界中的NSSM应用案例,了解其在不同场景下的最佳实践。
  • 故障模拟与应对:设计并实施模拟故障场景,练习紧急响应和恢复流程,提升应急处理能力。

7. 最佳实践与持续学习

  • 社区与资源:积极参与NSSM社区,关注最新的开发动态、技巧分享和问题解答。
  • 性能监控工具集成:探索如何将NSSM服务与Prometheus、Grafana等监控工具集成,实现全方位的服务性能监控。

通过上述中级大纲的学习,你将能够更熟练地运用NSSM进行复杂服务管理,提升服务的稳定性和安全性,同时提高工作效率。

NSSM(Non-Sucking Service Manager)的底层原理主要是基于 Windows 操作系统的服务管理机制。它通过调用 Windows 的服务控制管理器(SCM)来创建、启动、停止和管理服务。

具体而言,NSSM 实现了以下几个重要的功能和原理:

  1. 服务注册:NSSM 通过与 Windows SCM 交互,将用户指定的可执行程序注册为一个 Windows 服务。这使得系统能够以服务的方式对待用户指定的程序。

  2. 状态监控:一旦程序被注册为服务,NSSM 将负责监控该服务的运行状态。如果服务意外停止,NSSM 可以根据用户配置的规则来自动重新启动服务,以确保程序持续稳定地运行。

  3. 参数传递:NSSM 允许用户在创建服务时指定程序运行所需的参数,类似于通过命令行手动启动程序时所做的操作。这样就可以确保服务在启动时能够以正确的方式运行。

  4. 日志记录:NSSM 负责捕获服务的标准输出和标准错误输出,并将其记录在 Windows 事件日志中。这有助于用户跟踪服务的运行情况和排查问题。

 NSSM 的底层原理是构建在 Windows 操作系统的服务架构之上,通过与 SCM 的交互和管理,实现了用户程序到服务的转换和管理。这使得用户能够更方便地将各种程序作为服务在 Windows 系统上运行,并对这些服务进行有效地监控和管理。

NSSM(Non-Sucking Service Manager)的架构主要包括以下几个核心组件和功能:

  1. 用户界面:NSSM 提供了简单的命令行界面,用于用户与 NSSM 进行交互和配置服务。用户可以使用命令行参数来创建、启动、停止和管理服务。

  2. 服务注册:NSSM 通过与 Windows 服务控制管理器(SCM)交互,将用户指定的可执行程序注册为一个 Windows 服务。这个过程涉及到与 SCM 的通信和权限管理。

  3. 状态监控:一旦程序被注册为服务,NSSM 负责监控该服务的运行状态。它会定期检查服务的状态,并在需要时采取行动,比如自动重新启动服务。

  4. 参数传递:NSSM 允许用户在创建服务时指定程序运行所需的参数。这样可以确保服务在启动时能够以正确的方式运行。

  5. 日志记录:NSSM 负责捕获服务的标准输出和标准错误输出,并将其记录在 Windows 事件日志中。这有助于用户跟踪服务的运行情况和排查问题。

NSSM 的架构是基于 Windows 服务的架构,通过与 SCM 的交互和管理,实现了用户程序到服务的转换和管理。NSSM 提供了简单而强大的功能,使得用户能够更方便地将各种程序作为服务在 Windows 系统上运行,并对这些服务进行有效地监控和管理。

 当你准备使用NSSM(Non-Sucking Service Manager)时,以下是一个初级应用大纲,可以帮助你快速上手:

  1. 安装NSSM

    • 下载最新版本的NSSM可执行文件(nssm.exe)。
    • 将nssm.exe复制到一个目录,例如C:\nssm。
  2. 注册服务

    • 打开命令提示符(以管理员身份运行)。
    • 运行命令:cd C:\nssm 进入NSSM的目录。
    • 运行命令:nssm install YourServiceName 替换YourServiceName为你想要的服务名称。
    • 在弹出的对话框中,配置应用程序路径、启动参数等信息。
  3. 启动和管理服务

    • 运行命令:nssm start YourServiceName 来启动你的服务。
    • 运行命令:nssm stop YourServiceName 来停止你的服务。
    • 运行命令:nssm restart YourServiceName 来重启你的服务。
  4. 配置服务

    • 运行命令:nssm edit YourServiceName 来编辑你的服务配置,包括启动类型、标准输入输出重定向等。
  5. 卸载服务

    • 运行命令:nssm remove YourServiceName 来移除你的服务。

这个初级应用大纲可以帮助你快速了解如何安装、注册、管理和配置NSSM服务。当然,NSSM还有更多高级功能和选项,你可以在掌握基础之后进一步探索

 一个NSSM(Non-Sucking Service Manager)中级应用大纲,帮助你更深入地了解如何使用NSSM进行高级服务管理:

  1. 参数配置

    • 学习如何在NSSM中配置各种参数,例如启动类型、工作目录、环境变量等。
    • 了解如何设置延迟启动、重试机制、重定向标准输入输出等高级参数。
  2. 日志记录

    • 学习如何配置NSSM以记录服务的日志信息。
    • 掌握如何查看和分析NSSM生成的日志文件,以便及时发现和解决问题。
  3. 服务监控

    • 了解如何使用NSSM监控服务的状态,并设置相应的报警机制。
    • 学习如何通过NSSM实时监控服务的资源占用情况,以及如何优化服务性能。
  4. 服务依赖性

    • 学习如何配置NSSM以处理服务之间的依赖关系。
    • 掌握如何设置服务启动顺序,确保依赖服务能够按需启动。
  5. 安全性设置

    • 学习如何通过NSSM加强服务的安全性,例如设置服务的运行账户、权限等。
    • 了解如何使用NSSM进行服务的加密和认证配置,确保数据的安全传输。
  6. 版本管理

    • 了解不同版本NSSM之间的差异和更新内容。
    • 学习如何升级现有的NSSM版本,以获得最新功能和修复漏洞。

通过这个中级应用大纲,你可以进一步提升对NSSM的应用水平,学习如何利用其丰富的功能来管理和监控服务,以及如何提高服务的稳定性和安全性。祝你在使用NSSM过程中取得成功!

 一个NSSM(Non-Sucking Service Manager)高级应用大纲,帮助你深入学习如何使用NSSM进行高级的服务管理和优化:

  1. 性能优化

    • 学习如何通过NSSM进行服务的性能监控和优化。
    • 了解如何设置服务的资源限制,以避免资源过度占用导致的问题。
  2. 故障恢复

    • 学习如何配置NSSM以实现服务的自动故障检测和恢复。
    • 掌握如何设置故障转移策略,确保服务在发生故障时能够快速切换至备用状态。
  3. 集成管理

    • 了解如何将NSSM与其他管理工具(如监控系统、自动化部署工具)进行集成。
    • 学习如何通过API或命令行接口对NSSM进行远程管理和操作。
  4. 安全加固

    • 学习如何通过NSSM进行服务的安全审计和加固。
    • 掌握如何设置访问控制策略、安全审计日志等安全相关功能。
  5. 容器化支持

    • 了解如何在容器环境中使用NSSM,并学习与容器编排工具的集成方法。
    • 学习如何在容器中管理和监控NSSM服务的运行状态。
  6. 高可用架构

    • 学习如何通过NSSM实现高可用的服务架构。
    • 了解如何配置负载均衡、服务集群等高可用方案,并结合NSSM进行管理和监控。

通过这个高级应用大纲,你可以深入了解NSSM的高级功能和应用场景,学习如何通过NSSM实现服务的高可用、安全和稳定运行。祝你在使用NSSM进行高级服务管理时取得成功!如有任何问题,欢迎随时向我提问。

一个NSSM(Non-Sucking Service Manager)专家级应用大纲,帮助你更深入地了解如何在复杂环境中进行高级的服务管理和优化:

  1. 微服务架构

    • 学习如何在微服务架构中使用NSSM进行服务管理和编排。
    • 了解如何通过NSSM实现微服务之间的通讯、监控和故障处理。
  2. 持续集成/持续部署 (CI/CD)

    • 掌握如何将NSSM集成到CI/CD流程中,实现自动化部署和运维管理。
    • 学习如何通过NSSM实现持续交付和持续监控,确保服务的稳定性和可靠性。
  3. 自动化运维

    • 了解如何利用NSSM结合自动化运维工具进行全面的服务管理和监控。
    • 学习如何通过脚本和自动化工具实现对NSSM服务的批量操作和配置管理。
  4. 大规模部署

    • 学习如何在大规模集群中使用NSSM进行服务管理,并掌握相关的最佳实践。
    • 了解如何通过NSSM实现集群的动态扩缩容、负载均衡和故障转移。
  5. 安全合规

    • 学习如何通过NSSM满足安全合规性要求,包括数据保护、权限控制等方面的配置和管理。
    • 掌握如何进行安全审计和日志分析,以确保服务的安全性和合规性。
  6. 性能调优与监控

    • 了解如何通过NSSM进行服务的性能调优和监控,包括指标收集、性能分析和故障排查等方面的工作。
    • 学习如何利用NSSM实现服务的实时监控和预警,以确保服务始终处于最佳状态。

通过这个专家级应用大纲,你可以深入学习NSSM在复杂场景下的应用和管理,掌握高级的技能和经验,从而能够应对复杂的服务管理挑战。祝你在使用NSSM进行专家级服务管理时取得成功!

一个NSSM(Non-Sucking Service Manager)顶尖级应用大纲,旨在帮助你探索 NSSM 在最复杂和要求最高的环境中的应用:

  1. 分布式系统集成

    • 学习如何在大规模分布式系统中使用 NSSM 进行服务管理和协调。
    • 掌握如何通过 NSSM 实现分布式系统的服务发现、负载均衡和故障处理。
  2. 自动化运维与自愈

    • 了解如何利用人工智能和机器学习技术,结合 NSSM 实现自动化运维和自愈能力。
    • 学习如何构建自适应的系统,使其能够根据实时环境变化进行智能调整和优化。
  3. 多云环境管理

    • 掌握如何在混合云或多云环境中使用 NSSM 进行统一的服务管理和监控。
    • 学习如何通过 NSSM 实现跨云平台的服务迁移、弹性伸缩和资源优化。
  4. 边缘计算支持

    • 了解如何在边缘计算场景中使用 NSSM,管理分布在边缘节点的服务实例。
    • 学习如何通过 NSSM 实现边缘节点的自动注册、协同计算和本地数据处理。
  5. 安全与合规

    • 学习如何通过 NSSM 实现最高级别的安全和合规标准,包括数据加密、访问控制和合规审计等方面的管理。
    • 掌握如何应对安全威胁和风险,通过 NSSM 实现实时威胁检测和应急响应。
  6. 未来趋势与创新

    • 了解最新的技术趋势和创新应用,如容器化、服务器无状态化、无服务架构等,以及 NSSM 在这些领域的应用和发展方向。

通过这个顶尖级应用大纲,你将深入探索 NSSM 在最具挑战性的环境中的应用,并了解未来趋势和创新发展。祝你在探索 NSSM 顶尖级应用时取得成功!

Windows Services 是什么 为什么 怎么用 创建服务 管理服务 

Windows Services 是在 Windows 操作系统上运行的后台应用程序,它们在系统启动时自动启动,并且可以在系统运行时持续运行而不受用户登录或注销的影响。Windows Services 通常以服务(Service)的形式存在,可以通过服务管理器进行管理和配置。

Windows Services 的存在有以下几个主要原因:

  1. 持久性:Windows Services 可以在系统启动时自动启动并持续运行,即使用户没有登录系统也可以正常运行。这使得一些关键的系统任务、网络服务或后台处理可以在系统运行时始终可用。

  2. 无需用户交互:Windows Services 不需要用户交互界面,它们通常在后台默默地运行,执行各种任务,如监控文件夹、管理打印队列、提供网络服务等。用户无需干预或操作,服务会按照预先设定的规则或指令执行任务。

  3. 权限管理:Windows Services 可以以系统账户或特定用户账户的身份运行,具有较高的权限和访问系统资源的能力。这使得服务能够执行一些普通用户无法执行的系统级任务。

  4. 稳定性:由于 Windows Services 在后台运行且无需用户干预,因此它们通常比交互式应用程序更稳定。服务可以在系统运行时保持持续性,即使发生用户交互问题或程序崩溃,服务仍然可以继续工作。

在Windows操作系统中,新建系统服务可以为计算机系统提供各种功能和服务。系统服务是在后台运行的软件模块,它们可以在系统启动时自动加载,并在整个系统运行过程中提供特定的功能。以下是新建系统服务的作用和优势:

作用:

  1. 提供系统级功能:系统服务可以在系统级别提供各种功能,如网络连接、安全认证、数据备份等。

  2. 实现自动化任务:通过系统服务,可以实现在系统启动时自动执行特定任务或服务,无需用户干预。

  3. 提供持续性服务:系统服务可以在后台持续运行,不受用户登录或注销的影响,确保相关功能一直可用。

  4. 监控和管理资源:系统服务可以监控系统资源的使用情况,管理系统的运行状态,以确保系统稳定性和效率。

优势:

  1. 稳定性:系统服务通常以较低权限级别运行,能够提高系统的稳定性,避免用户误操作带来的影响。

  2. 安全性:系统服务通常受到系统权限控制的限制,可以提高系统的安全性,避免恶意软件对系统的破坏。

  3. 自动化:系统服务可以自动启动和运行,无需用户手动干预,提高了系统管理的效率和便利性。

  4. 后台运行:系统服务在后台运行,不会占用用户界面或影响用户操作,可以保持系统界面的整洁和用户体验。

  5. 可靠性:系统服务通常经过严格测试和验证,具有较高的可靠性和稳定性,能够长时间运行而不出现故障。

新建系统服务可以应用于各种场景,以下是一些常见的应用场景:

  1. 网络服务:可以创建网络相关的系统服务,例如 DHCP 服务、DNS 服务器、SMTP 服务器等,以提供网络连接和通信支持。

  2. 安全认证:可以创建安全认证服务,例如 Kerberos 服务、LDAP 服务等,以确保用户身份验证和授权的安全性。

  3. 数据备份和恢复:可以创建数据备份和恢复服务,例如文件备份服务、磁盘映像服务等,以保护数据的完整性和可靠性。

  4. 远程管理:可以创建远程管理服务,例如远程桌面服务、Telnet 服务等,以便管理员可以在远程登录的情况下管理系统。

  5. 系统监控:可以创建系统监控服务,例如性能监视器服务、事件日志服务等,以监测系统资源使用情况和错误日志,提供故障排查和优化支持。

  6. 自定义服务:可以根据特定需求创建自定义系统服务,例如定时任务服务、进程管理服务等,以满足特定的业务需求。

系统服务的用途非常广泛,主要包括以下几个方面:

  1. 系统管理:系统服务可以用于实现系统管理功能,如系统监控、日志记录、远程管理等,帮助管理员更好地管理和维护计算机系统。

  2. 自动化任务:系统服务可以用于执行各种自动化任务,如定时任务、数据备份、文件同步等,提高工作效率并降低人工操作成本。

  3. 网络服务:系统服务可以提供各种网络服务,如Web服务器、FTP服务器、邮件服务器等,用于支持网络通信和数据传输。

  4. 安全认证:系统服务可以实现安全认证功能,如用户身份验证、访问控制、数据加密等,保护系统和数据的安全性。

  5. 资源管理:系统服务可以监控和管理系统资源的使用情况,如内存管理、CPU调度、磁盘空间管理等,确保系统资源的合理分配和利用。

  6. 后台任务:系统服务可以在后台运行,不会占用用户界面,用于执行一些需要持续运行的任务,如打印服务、消息队列等。

  7. 应用支持:某些应用程序可能需要依赖特定的系统服务来提供支持,如数据库服务、消息通知服务等,以实现特定功能或服务。

系统服务的基础技术原理涉及操作系统、进程管理、权限控制、通信机制等多个方面,以下是系统服务的基础技术原理:

  1. 操作系统基础:系统服务是建立在操作系统之上的,因此对操作系统的理解是非常重要的。操作系统提供了各种系统调用和接口,允许系统服务与底层硬件和其他系统组件进行交互。

  2. 进程管理:系统服务通常以进程或线程的形式运行。进程管理涉及创建、调度、终止和通信等操作,确保系统服务能够按需运行并与其他进程协同工作。

  3. 权限控制:系统服务需要受到严格的权限控制,以确保系统安全。权限控制涉及用户认证、访问控制和特权管理等方面,防止未经授权的访问和恶意操作。

  4. 通信机制:系统服务通常需要与其他组件进行通信,包括进程间通信和网络通信。通信机制可以通过管道、套接字、RPC(远程过程调用)等方式实现。

  5. 启动和初始化:系统服务通常在系统启动时被加载和初始化。这涉及到系统引导过程、启动脚本、服务注册表等,确保系统服务在适当的时刻得以启动和运行。

  6. 资源管理:系统服务需要管理系统资源,包括内存、文件系统、网络接口等。资源管理涉及对资源的分配、释放和监控,以确保系统服务能够正常运行。

  7. 错误处理:系统服务需要具备一定的错误处理机制,能够对异常情况进行识别、记录和处理,确保系统服务的稳定性和可靠性。

  8. 性能优化:系统服务需要具备一定的性能优化机制,包括并发处理、缓存管理、负载均衡等,以提高系统服务的响应速度和吞吐量。

 


NSSM -the Non-Sucking Service Manager

适用于Windows 10、Server 2016及更新版本 2017-04-26: Windows 10创作者更新或更新版本的用户应使用预发布版本2.24-101或任何更新版本,以避免服务启动失败的问题。如果由于某种原因无法使用该版本,您可以在注册表中设置AppNoConsole=1,但请注意,期望有控制台窗口的应用程序可能会出现意外行为。

感谢Sebasian Krause进行了初步诊断。

下载 NSSM应该适用于Windows 2000或更高版本。具体来说,支持Windows 7、Windows 8和Windows 10。下载中包含32位和64位二进制文件。大多数情况下,在64位Windows上运行32位版本应该是安全的,但在某些情况下,您可能发现它不起作用,必须使用64位版本。两个版本都是从相同的源代码编译而来。如果其中一个适用于您,请使用该版本。如果不适用,请尝试另一个版本。

许可证 NSSM属于公共领域。您可以无条件地使用它及/或其源代码,以满足您的任何需求。

最新版本 NSSM 2.24(2014-08-31) [be7b3577c6e3a280e5106a9e9db5b3775931cefc]

特色预发布版本 NSSM 2.24-101-g897c7ad(2017-04-26) [ca2f6782a05af85facf9b620e047b01271edd11d]

NSSM使用Jenkins持续集成服务器构建。如果您有勇气,可以下载任何可用的构建。

源代码 源代码包含在下载中,或者您可以浏览gitweb并查看Changelog

您还可以使用git从git://git.nssm.cc/nssm/nssm.git或http://git.nssm.cc/nssm/nssm.git克隆存储库。

Chocolatey软件包 您可以使用Chocolatey安装NSSM。Chocolatey软件包由第三方构建和维护,并可能与此处提供的最新构建不一致。

 

nssm 非常类似于 srvany。当由系统服务管理器启动时,它会在注册表中查找键 HKLM\System\CurrentControlSet\Services\servicename\Parameters,并尝试启动列在 Application 中的程序,在列在 AppDirectory 中的目录中启动,并传递列在 AppParameters 中的选项标志。细心的读者将注意到,这些值与 srvany 读取的值相同,这意味着 nssm 可以直接替换 srvany。

nssm 相关于这些注册表设置的行为在版本 2.8 中发生了变化。在以前的版本中,nssm 只会在服务启动时读取注册表一次。从版本 2.8 开始,每次监视的应用程序重新启动时都会查询注册表。在对注册表进行更改后,您无需重新启动 nssm 本身。

nssm 可以配置为在应用程序退出时执行四种操作之一,并且甚至可以根据应用程序的退出代码配置不同的操作。可能的操作包括:

Restart - nssm 将尝试重新启动应用程序。

在 2.2 版本之前,nssm 总是这样做,如果您没有像下面描述的那样明确配置,则现在是默认行为。升级到较新版本的 nssm 不会更改您的服务行为。

Ignore - nssm 将不尝试重新启动应用程序。Windows 服务管理器将看到您的服务仍在运行。这使您可以创建一个服务,在系统启动时运行一次,并通过检查您的服务是否处于运行状态来确保其成功完成。

这是 srvany 的默认行为,尽管这可能并不是预期的,并且通常不是您想要的,除非在上述用例中。

Exit - nssm 将退出。Windows 服务管理器将看到您的服务已停止。您可以配置它在失败时采取操作,使用标准操作系统工具。

Suicide - nssm 将以不干净的方式退出,而不标记服务为已停止。在 Vista 之前的 Windows 版本中,这是确保采取服务恢复操作的唯一方法,因为退出在旧操作系统上不起作用。

请注意,如果应用程序以退出代码 0 退出,则 nssm 不会自杀,除非您明确为 0 添加一个 AppExit 条目。这是为了防止服务管理器在优雅应用程序退出后采取失败恢复操作。

查看使用说明,了解如何为您的服务设置其中一种操作。

nssm 可以将被监视应用程序的 I/O 重定向到任何可使用 CreateFile() 系统函数打开的目标,使您能够捕获应用程序记录的状态消息,重定向来自命名管道的输入,访问串行端口等其他奇特的功能。使用说明有更多详细信息。

有关 nssm 运行服务和处理应用程序失败的详细信息,请参阅下载包中包含的源代码并查看 flmonitor 文档。nssm 基本上是 flmonitor 的抽象。

版本 2.22 版本 2.22 是 nssm 自首次发布以来的最大更新。主要新功能包括:

nssm 现在具有完全功能的图形用户界面。

除了大多数用户永远不会看到或在意的一些小例外外,nssm 可以通过其图形用户界面完成的任何事情都可以通过命令行参数完成。

nssm 选项现在可以使用命令行设置。

可以使用命令行设置服务参数,而无需使用注册表或新 GUI。因此,现在更容易从脚本安装和配置服务。

nssm 现在可以管理本地服务。

大多数系统服务的参数,例如启动类型或登录用户,可以使用命令行或 GUI 进行管理。

nssm 可以启动、停止和查询任何服务的状态。

nssm 现在可以旋转被监视应用程序的输出文件。

当应用程序正在运行时,日志可以在达到可配置大小时旋转。在启动应用程序之前,还可以旋转现有日志。

nssm 现在可以设置被监视应用程序的优先级类和 CPU 亲和性。

nssm 现在处理尝试从 stdin 读取的控制台应用程序。

以前,这类应用程序可能会在启动后立即退出,因为它们认为输入结束意味着用户希望它们退出。

nssm 现在支持 UAC。

如果您是管理员组的成员并从未提升的命令提示符中启动,nssm 将提示输入管理员凭据。

但请注意,如果 nssm 自身提升,其输出将被隐藏。这是无法避免的。

nssm 现在是 Unicode 应用程序。

所有版本

nssm使用Jenkins持续集成服务器构建。是的,构建从机由nssm本身控制,像这样:

nssm install Jenkins %PROGRAMFILES%\Java\jre7\bin\java.exe
nssm set Jenkins AppParameters -jar slave.jar -jnlpUrl https://jenkins/computer/%COMPUTERNAME%/slave-agent.jnlp -secret redacted
nssm set Jenkins AppDirectory C:\Jenkins
nssm set Jenkins AppStdout C:\Jenkins\jenkins.log
nssm set Jenkins AppStderr C:\Jenkins\jenkins.log
nssm set Jenkins AppStopMethodSkip 6
nssm set Jenkins AppStopMethodConsole 1000
nssm set Jenkins AppThrottle 5000
nssm start Jenkins

警告!

nssm需要管理员权限才能管理服务。大多数使用nssm的服务以LOCALSYSTEM权限运行。nssm中的错误可能导致严重问题,如过度使用CPU、内存耗尽、数据丢失甚至蓝屏。

此类错误是无意的,并且nssm已经有许多全球满意的用户证明其发行版的稳定性。下载其中一个开发版本时,需自担风险。


使用说明

不需要“安装”nssm。只需将其放置在系统中的某个位置(最好是PATH中的某个位置)并运行即可。

然而,请注意,nssm会将自己注册为事件日志消息源,这意味着从不同位置运行多个实例或不同版本的nssm可能会导致混淆。还要注意,如果运行事件查看器,它将打开nssm可执行文件,防止您覆盖它。如果要升级nssm,请记住这一点。

某些功能被标记为特定版本的支持。如果所描述的版本比下载页面上可用的版本更新,则可能有一个启用该功能的预发布版本。

以下等效命令示例显示了如何配置现有服务以匹配屏幕截图。在许多情况下,它们代表了相关参数的默认值,因此是多余的。任何参数也可以使用以下命令将其重置为其默认值:

nssm reset <servicename> <parameter>

安装服务

您可以使用nssm安装服务。键入的命令是:

nssm install <servicename> 安装程序由多个选项卡组成,具有许多可配置的参数。大多数参数都预设为nssm的默认值,因此可以在不离开Application选项卡的情况下安装服务。

应用程序选项卡application

路径到要运行的应用程序(或脚本)是唯一必需的字段。如果应用程序需要在特定目录中启动,则可以在“启动目录”字段中输入它。如果该字段留空,则默认启动目录将是包含应用程序的目录。参数字段可用于指定要传递给应用程序的任何命令行参数。

下面的屏幕截图显示了UT2003服务器的安装。运行此类服务的命令是ucc server,因此在Path下输入到UCC.exe的完整路径,在Options下输入server。

等效命令:

nssm set UT2003 Application C:\games\ut2003\System\UCC.exe

nssm set UT2003 AppDirectory C:\games\ut2003\System

nssm set UT2003 AppParameters server

单击“安装服务”即可完成服务的安装。

详细信息选项卡details

详细信息选项卡列出了有关服务的系统详细信息。

等效命令:

nssm set UT2003 DisplayName UT2k3

nssm set UT2003 Description Unreal Tournament 2003

nssm set UT2003 Start SERVICE_AUTO_START

登录选项卡log on

登录选项卡可用于管理运行服务的用户帐户。nssm将自动确保您选择的帐户具有必要的“作为服务登录”的权限。

等效命令:

nssm set UT2003 ObjectName LocalSystem

nssm set UT2003 Type SERVICE_WIN32_OWN_PROCESS

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

依赖项dependencies

依赖项选项卡列出了在服务运行之前必须启动的任何服务或服务组。

您可以逐行输入服务名称或显示名称。服务组名称必须以SC_GROUP_IDENTIFIER前缀(即+符号)开头。

等效命令:

nssm set UT2003 DependOnService MpsSvc

进程选项卡process

进程选项卡可用于设置应用程序的进程优先级和CPU亲和性。默认情况下,应用程序将以正常优先级运行,并被允许在所有CPU上执行。如果您希望将进程限制在可用CPU的子集上运行,请取消选中“所有处理器”,然后按需选择CPU。

在服务运行时,可以通过Windows任务管理器更改进程优先级和亲和性。

等效命令:

nssm set UT2003 AppPriority NORMAL_PRIORITY_CLASS

nssm set UT2003 AppNoConsole 0

nssm set UT2003 AppAffinity All

关机选项卡 shutdown

关机选项卡列出了在应用程序崩溃后或服务被正常停止时用于整理应用程序的各种停止方法和超时。

等效命令:

nssm set UT2003 AppStopMethodSkip 0

nssm set UT2003 AppStopMethodConsole 1500

nssm set UT2003 AppStopMethodWindow 1500

nssm set UT2003 AppStopMethodThreads 1500

退出操作选项卡 exit actions

退出操作选项卡可用于调整服务的重新启动节流和退出时的默认操作。您还可以指定应用程序自动重新启动之间的强制延迟。

要为特定应用程序退出代码配置退出操作,必须像下面描述的方式使用注册表。

等效命令:

nssm set UT2003 AppThrottle 1500

nssm set UT2003 AppExit Default Restart

nssm set UT2003 AppRestartDelay 0

I/O选项卡

I/O选项卡可用于在启用I/O重定向时指定输入和/或输出文件。通常,设置输出和错误就足以捕获应用程序生成的日志消息。

要获得对路径和访问模式更多控制,请按照下面的描述在注册表中配置I/O。

等效命令:

nssm set UT2003 AppStdout C:\games\ut2003\service.log

nssm set UT2003 AppStderr C:\games\ut2003\service.log

文件轮转选项卡file rotation

文件轮转选项卡可与I/O设置配合使用,配置在服务重新启动时输出文件的轮转。

如果选中了"替换现有的输出文件"和/或"错误文件"复选框,nssm将在启动服务时覆盖现有的输出文件。默认情况下,它会追加到任何现有文件中。如果选中了"轮转文件"复选框,nssm将在设置I/O重定向之前对现有文件进行重命名。使用"限制轮转"字段可以禁用已经修改时间比指定秒数更近或者小于指定千字节大小的文件的轮转。

默认情况下,nssm仅在服务(重新)启动时执行文件轮转。要启用在服务运行期间达到指定大小限制时的文件轮转,请选中"服务运行时轮转"复选框。在线轮转忽略任何配置的文件年龄限制。

注意,在线轮转需要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

环境选项卡可用于指定传递给应用程序的换行分隔的环境变量列表。如果选中了"替换默认环境"复选框,则只传递指定的变量给服务。当未选中(默认情况下)时,将保留在服务启动时创建的环境。

等效命令:

nssm set <servicename> AppEnvironmentExtra JAVA_HOME=C:\java 通过命令行安装 从2.0版本开始,您还可以绕过GUI,从命令行安装服务。语法为:

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

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

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

nssm install <servicename> "C:\Program Files\app.exe" 如果您希望提供的选项之一包含空格,您也需要对其进行引用,并对引号本身进行引用。

nssm install <servicename> <application> """This is one argument""" Isaballa Sanfelipo提出了从批处理文件中安装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" 移除服务 删除服务的命令为:

nssm remove <servicename>

从版本2.0开始,您也可以通过命令行删除服务,命令如下:

nssm remove <servicename> confirm

nssm愉快地尝试移除任何服务,不仅仅是nssm本身管理的服务。请尽量不要删除您不应该删除的服务...

服务关闭 当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。

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后等待的时间。

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

退出操作 要配置应用程序退出时 nssm 应该采取的操作,编辑注册表中键 HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppExit 的默认值。如果 nssm 运行时注册表中不存在该键,它将创建该键并将值设为 Restart。将其更改为 Ignore 或 Exit 以指定所采取的操作。nssm 只有在该键不存在时才会创建此键。您的更改不会被覆盖。

要为特定退出代码指定不同的操作,创建一个字符串(REG_SZ)值,位于 AppExit 键下,其名称是要考虑的退出代码。例如,要在退出代码为 0 时停止服务(通常表示应用程序成功完成),请创建 HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppExit\0 并将其设置为 Exit。查看事件日志中来自 nssm 的消息,了解您的应用程序返回的退出代码。

如果您的应用程序的退出代码与注册表条目不对应,nssm 在决定如何处理时将使用 AppExit 的默认值。

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

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

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

有关 nssm 在配置了节流和重启延迟时的工作方式的注意事项,请参阅下面的重启节流部分。

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

第一次重启将尝试不延迟。如果重启后的应用程序继续在运行时间未达到阈值的毫秒数而退出,nssm 将至少暂停 2000 毫秒,对于每次后续失败会使暂停时间加倍。它将最长暂停 256000 毫秒,大约四分钟。当服务成功运行至少达到阈值时间时,延迟计数器将被重置。

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

当配置了重新启动延迟且应用程序过早退出时,nssm 将根据配置的延迟和计算出的节流时间中较长的时间来节流重启。例如,如果配置了 3000 毫秒的重启延迟,并且服务在每次启动时失败,那么第一次重启尝试将延迟 3000 毫秒,因为配置的 3000 毫秒比 0 毫秒的节流更长。第二次尝试也将延迟 3000 毫秒;3000 毫秒配置再次比 2000 毫秒的节流更长。第三次尝试将延迟 4000 毫秒;比配置的 3000 毫秒更长。

因此,如果打算使用重启延迟来配置间隔小于五分钟的短时服务,应考虑降低 AppThrottle 的值。

进程优先级和 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 开始,表示应用程序可以在哪些 CPU 上运行。也可以通过用短划线分隔索引来指定 ID 的范围。

在亲和性字符串中,只有数字、短划线和逗号是有效的。

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

控制台窗口 从版本 2.22 开始,nssm 默认会为应用程序创建一个新的控制台窗口。这使得一些本来会失败的程序能够正常工作,比如那些希望能够读取用户输入的程序。如果不需要控制台窗口,可以通过将整数(REG_DWORD)值 AppNoConsole 设置为非零值来禁用控制台窗口,该值位于 HKLM\System\CurrentControlSet\Services\servicename\Parameters 下。

I/O重定向

nssm可以将托管应用程序的I/O重定向到任何可以由CreateFile()打开的路径。如果您的应用程序期望能够记录到控制台,则此功能可能很有用。

nssm将查找HKLM\System\CurrentControlSet\Services\servicename\Parameters下对应于CreateFile()参数的键。所有都是可选的。如果没有为特定流给出路径,它将不会被重定向。如果给出了路径但没有其他值,则它们将接收合理的默认值。

AppStdin(字符串)-用于接收输入的路径。

AppStdinShareMode(整数)-输入的ShareMode参数。

AppStdinCreationDisposition(整数)-输入的CreationDisposition参数。

AppStdinFlagsAndAttributes(整数)-输入的FlagsAndAttributes参数。

AppStdout(字符串)-用于接收输出的路径。

AppStdoutShareMode(整数)-输出的ShareMode参数。

AppStdoutCreationDisposition(整数)-输出的CreationDisposition参数。

AppStdoutFlagsAndAttributes(整数)-输出的FlagsAndAttributes参数。

AppStderr(字符串)-用于接收错误输出的路径。

AppStderrShareMode(整数)-错误输出的ShareMode参数。

AppStderrCreationDisposition(整数)-错误输出的CreationDisposition参数。

AppStderrFlagsAndAttributes(整数)-错误输出的FlagsAndAttributes参数。

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

可以将stderr和stdout定向到相同的路径,但由于nssm的限制,您必须在AppStdout和AppStderr注册表值中提供完全相同的字符串。仅当两个条目完全相同时,nssm才能交错这两个流。

文件旋转

从版本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将要求满足两个条件才能旋转文件。

在线旋转

如果将整数(REG_DWORD)值AppRotateOnline设置为1,则nssm可以在服务运行时旋转增长到配置文件大小限制的文件。 AppRotateSeconds的值被忽略以进行在线旋转,但仍将适用于(重新)启动服务之前的旋转。

如果未设置AppRotate,则忽略AppRotateOnline。

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

按需旋转

nssm可以按需旋转输出文件,而不考虑它们是否已达到配置的大小限制。要请求服务的文件旋转,请发送用户定义的服务控件128或运行以下命令:

nssm rotate <servicename>

按需旋转的限制是,实际文件重命名不会发生,直到读取应用程序的下一行输入为止。因此,根据应用程序的详细程度,发出旋转请求和进行旋转之间可能会有相当长的延迟时间。

即使未配置AppRotateBytes,即如果服务在运行时不会旋转文件,按需旋转也将起作用。但是,除非同时配置了AppRotate和AppRotateOnline,否则它将不起作用。

I/O重定向技术细节

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

不重定向

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

I/O重定向;禁用在线旋转

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

这种情况是三种情况中最复杂的,因此也是最容易出现问题的情况,可能导致应用程序输出丢失。

首先,nssm调用CreateFile(),就像前面的情况一样。然后,它调用CreatePipe()打开一个匿名管道。管道的读取端和输出文件的句柄被传递给一个新线程,该线程执行实际的写入操作。管道的写入端使用DuplicateHandle()进行复制,以便传递给CreateProcess()。因此,应用程序将使用打开的文件句柄运行,而nssm本身则具有对管道的另一端和输出文件的句柄。

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

当nssm收到按需旋转请求时,它会设置一个标志,指示写入线程在下一次ReadFile()调用完成后执行旋转,而不考虑文件大小。由于ReadFile()会阻塞执行直到读取到数据,nssm直到应用程序产生下一行输出才会实际进行文件旋转。

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

如果同时重定向了stdout和stderr,并且分别重定向到不同的文件中,nssm将为每个流生成一个写入线程。如果不幸地(或出于恶意)运行一个应用程序,它在stdout中写入Unicode,并在stderr中写入ANSI - 或者反过来 - nssm也可以处理这种情况。

从上面可以明显看出,在线旋转存在许多问题。nssm将尝试优雅地处理I/O过程中的任何问题,但为了安全起见,除非您的输出如此庞大以至于别无选择,否则请考虑不要使用在线旋转。

环境变量 从版本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。


命令行管理服务 nssm的核心功能始终可以通过命令行使用。

安装服务 nssm install <servicename> nssm install <servicename> <program>

nssm install <servicename> <program> [<arguments>] 默认情况下,服务的启动目录将设置为包含程序的目录。

可以在安装服务后覆盖启动目录。

nssm set <servicename> AppDirectory <path> 删除服务

nssm remove nssm remove <servicename>

nssm remove <servicename> confirm

服务管理 从版本2.22开始,nssm提供基本的服务管理功能。

nssm还可以在期望服务名称的任何位置接受服务显示名称,因为Windows不允许服务的名称或显示名称与其他服务的名称或显示名称冲突。

服务名称(也称为服务键名)和其显示名称都唯一标识一个服务。

启动和停止服务 nssm start <servicename>

nssm stop <servicename>

nssm restart <servicename> 查询服务状态

nssm status <servicename> 向服务发送控制命令

nssm pause <servicename> nssm continue <servicename>

nssm rotate <servicename> nssm rotate会根据需要旋转具有I/O重定向和在线旋转功能的nssm服务的输出文件。

nssm接受用户自定义的控制码128作为启动输出文件旋转的信号。

非nssm服务可能会以自己的方式响应控制码128(或忽略它,或崩溃)。

编辑服务 从版本2.22开始,可以在命令行上查询或配置nssm可以理解的所有参数。某些系统参数也可以查询,并且在某些情况下可以修改。

通用语法 通常可以使用以下方式查询参数。

nssm get <servicename> <parameter> 某些参数存在歧义,需要使用子参数。请参见下面的示例。

nssm get <servicename> <parameter> <subparameter> 通常可以使用类似的方式设置参数。

nssm set <servicename> <parameter> <value>

nssm set <servicename> <parameter> <subparameter> <value>

大多数参数可以重置为默认值,这相当于删除相关的注册表项。

nssm reset <servicename> <parameter>

nssm reset <servicename> <parameter> <subparameter> 作为便利,nssm会接受除所需值之外的其他参数,并将它们连接在一起,用单个空格分隔。因此,以下两个命令是相同的:

nssm set <servicename> AppParameters "-classpath C:\Classes"

nssm set <servicename> AppParameters -classpath C:\Classes 参数 参数通常是与控制相关功能的注册表项同名的字符串。例如,以下命令设置服务的启动目录:

nssm set <servicename> AppDirectory <path> 值 大多数参数通过设置与相关注册表项文档中记录的相同值来配置。例如,要启用文件旋转,可以使用以下命令:

nssm set <servicename> AppRotation 1 以下是以不同方式设置值的参数列表。

本地参数 某些参数配置的是服务本身的属性,而不是nssm的行为。它们也以关联的注册表值命名。

DependOnGroup:在服务启动之前必须启动的加载顺序组的成员。

DependOnService:在服务启动之前必须启动的服务。

Description:服务的描述。

DisplayName:服务的显示名称,例如"应用层网关服务"。在服务管理器(services.msc)的"名称"列下显示此名称。

ImagePath:服务可执行文件的路径,例如"C:\Windows\System32\alg.exe"。对于nssm服务,这将是nssm.exe的路径。

ObjectName:服务运行的用户帐户名称。默认为LOCALSYSTEM。

Name:服务键名,例如"ALG"。键名无法更改。可以使用 nssm get <displayname> Name 命令查找服务的键名。

Start:服务的启动类型,例如"自动"。

Type:服务类型。nssm只能编辑SERVICE_WIN32_OWN_PROCESS类型的服务。

非标准参数

在与nssm get一起使用时,AppEnvironment和AppEnvironmentExtra接受一个可选的子参数。如果没有提供子参数,nssm get会按KEY=VALUE的形式每行打印一个已配置的环境变量。如果给出了子参数,nssm get将打印为该命名环境变量配置的值,或者如果该变量不存在于环境块中,则打印空字符串。

例如,假设AppEnvironmentExtra配置了两个变量,CLASSPATH=C:\Classes和TEMP=C:\Temp。以下调用:

nssm get <servicename> AppEnvironmentExtra 将打印:

CLASSPATH=C:\Classes TEMP=C:\Temp 而以下语法:

nssm get <servicename> AppEnvironmentExtra CLASSPATH 将打印:

C:\Classes 当使用nssm set设置环境块时,每个变量都应在单独的参数中指定为KEY=VALUE对。例如:

nssm set <servicename> AppEnvironmentExtra CLASSPATH=C:\Classes TEMP=C:\Temp AppExit参数需要指定要获取或设置的退出代码的子参数。可以使用字符串Default指定默认操作。

例如,要获取服务的默认退出操作,应运行:

nssm get <servicename> AppExit Default 要获取应用程序以退出代码2退出时的退出操作,请运行:

nssm get <servicename> AppExit 2 请注意,如果未为指定的退出代码配置显式操作,则nssm将打印默认退出操作。

要配置服务在应用程序以退出代码2退出时停止,请运行:

nssm set <servicename> AppExit 2 Exit AppPriority参数需要一个优先级类常量,如SetPriorityClass()文档中所述。有效优先级为:

REALTIME_PRIORITY_CLASS HIGH_PRIORITY_CLASS

ABOVE_NORMAL_PRIORITY_CLASS

NORMAL_PRIORITY_CLASS

BELOW_NORMAL_PRIORITY_CLASS

IDLE_PRIORITY_CLASS

非标准本机参数

当与nssm set一起使用时,DependOnGroup和DependOnService参数将每个后续命令行参数视为依赖组或服务。

组可以使用或不使用SC_GROUP_IDENTIFIER前缀(+符号)来指定。服务可以通过其键名或显示名称指定。

以下两个调用是等效的:

nssm set <servicename> DependOnService RpcSS LanmanWorkstation

nssm set <servicename> DependOnService "Remote Procedure Call (RPC)" LanmanWorkstation

在使用nssm get查询时,组将始终以SC_GROUP_IDENTIFIER前缀开头。

在与nssm set一起使用时,ObjectName参数需要一个额外的参数,用于指定运行服务的用户密码。

要检索用户名,请运行:

nssm get <servicename> ObjectName 要设置用户名和密码,请运行:

nssm set <servicename> ObjectName <username> <password> 请注意,参数连接的规则仍然适用。以下调用将产生预期的效果:

nssm set <servicename> ObjectName <username> correct horse battery staple 如果您绝对必须配置一个空密码的帐户,请运行:

nssm set <servicename> ObjectName <username> "" Start参数的有效值为:

SERVICE_AUTO_START:在启动时自动启动。

SERVICE_DELAYED_AUTO_START:延迟启动。

SERVICE_DEMAND_START:手动启动。

SERVICE_DISABLED:服务已禁用。 请注意,

SERVICE_DELAYED_AUTO_START不受支持在Vista之前的Windows版本上。

如果延迟启动不可用,nssm会将服务设置为自动启动。

Type参数用于查询或设置服务类型。nssm识别所有当前记录的服务类型,但只允许设置两种类型之一:

SERVICE_WIN32_OWN_PROCESS:独立服务。这是默认设置。 SERVICE_INTERACTIVE_PROCESS:可以与桌面交互的服务。

只有在LOCALSYSTEM帐户下运行时,才能将服务配置为交互式。

为了确保成功配置交互式服务,请按顺序运行两个命令:

nssm reset <servicename> ObjectName

nssm set <servicename> Type SERVICE_INTERACTIVE_PROCESS


使用案例 管理应该持续运行的服务 按照使用说明中的描述安装服务。如果您的应用程序出现故障或崩溃,nssm将尝试重新启动它。

将脚本作为服务运行 您不仅限于运行标准可执行文件作为服务,nssm还可以管理脚本。只需配置到您的bat或cmd脚本的路径,它就会正确运行。

在系统启动时运行工具或脚本一次 安装服务,然后打开注册表,并按照使用说明中的描述将退出操作配置为忽略。如果您希望nssm重试您的脚本直到成功,创建一个与成功退出代码相对应的注册表项,并将其设置为忽略,默认为重新启动。

自定义服务失败时采取的操作 请注意,对于早于Vista版本的Windows来说,所需的步骤略有不同。

Windows服务管理器能够在服务退出时采取不同的操作。请参阅服务属性窗口的"恢复"选项卡以了解更多详细信息。Windows可以重新启动服务、调用程序或脚本,甚至重新启动计算机。然而,默认情况下,它不会采取任何操作,如果不知道应用程序是否实际停止,也无法采取任何操作,这是srvany的一个大弱点。

安装服务并将退出操作设置为"Exit",以使nssm可靠地报告服务失败,然后通过Windows配置您首选的服务恢复操作。

如果您使用的是早于Vista的Windows版本,则以上操作是不够的。即使nssm报告服务以错误停止,服务管理器也不会应用恢复操作,因为它认为服务是正常停止的。如果要恢复服务,必须将nssm的退出操作设置为"Suicide",以模拟崩溃。如果希望在应用程序正常退出时采取恢复操作,还必须将退出代码0的动作显式设置为"Suicide"。

在使用srvany的位置使用nssm 如果您已经使用instsrv和srvany组合来运行您的服务,nssm几乎可以作为替代品。停止您的服务,然后编辑注册表,将HKLM\System\CurrentControlSet\Services\servicename\ImagePath更改为X:\path\to\nssm.exe,其中X:\path\to是您安装nssm的位置。

请注意,与srvany不同,nssm将无法更改到AppDirectory注册表设置中指定的目录错误视为错误。

如果nssm无法访问AppDirectory,则服务将无法启动。另一方面,srvany将启动但将从%SYSTEMROOT%中运行。如果配置的目录无效,nssm将在事件日志中记录一个错误。

请记住,网络驱动器是按用户配置的,除非您明确配置,否则服务将在LOCALSYSTEM账户下运行。尝试将网络驱动器(例如z:\)配置为服务的AppDirectory可能会失败。形式为\server\share的UNC路径是可以的。


 

posted @ 2024-02-17 01:26  suv789  阅读(2550)  评论(0编辑  收藏  举报