管理 Windows 自定义服务(Windows Service)

管理 Windows 自定义服务(Windows Service)

什么是 Windows 服务

Windows 系统中的服务主要分为「Windows 系统服务」和「应用程序服务」这两大类,其中:

Windows 系统服务

Windows 服务是 Windows NT 系列操作系统(如 Windows 11、10、8、7、Vista)的核心组成部分。

计算机启动时,Windows 会启动一些基础服务,以确保操作系统和其他程序能够顺利运行。例如,「Windows Time」服务就用于同步软件、网络、网站和服务器的当前日期和时间。

在 Windows 系统中,会有几十上百个服务在后台运行,但不是所有服务对 Windows 的运行都至关重要。例如,如果你的设备中没有搭载蓝牙模块,「Bluetooth Support Service」就无需在后台运行。

应用程序服务

除了 Windows 服务外,在安装一些应用程序时,也会在系统中安装自己的专属服务。例如,Google Chrome 浏览器安装时就会注册以下服务:

  • Google Chrome Elevation Service
  • Google 更新服务(gupdate)
  • Google 更新服务(gupdatem)

有时候我们需要在 Windows 里运行需要后台启动的命令行程序(比如 Aria2、Caddy 等)。此时,一般情况下我们需要开启一个 cmd 或 PowerShell 窗口,运行命令行程序后,最小化窗口,并且不能关闭。需要关闭或重启该命令行程序时,再在 cmd 或 PowerShell 窗口里手动关闭或重启之。总之,操作起来是比较麻烦的。那么,有没有一种简单的办法可以将这些命令行程序集成到 Windows 服务里呢?答案是有的。下面分别通过使用第三方工具、cmd 的内置命令(sc) 和 PowerShell 的内置命令(New-Service) 将命令行程序集成到 Windows 服务中。

使用第三方工具

NSSM (可创建带启动参数的服务)

NSSM(Non-Sucking Service Manager)是一个第三方工具,可用于在 Windows 上创建和管理服务。

安装和使用

  1. 安装 NSSM

  2. 使用 NSSM 创建服务

    • 需要显示服务安装 GUI:

      nssm install [<ServiceName>]
      

      GUI 如下图所示:

      img

    • 需要隐藏服务安装 GUI:

      nssm install <ServiceName> <Path to Executable> [<args> ...]
      

    以创建 Aria2 服务为例:

    nssm install Aria2 D:\aria2\aria2c.exe
    nssm set Aria2 AppDirectory D:\aria2
    nssm set Aria2 AppParameters --conf=aria2.conf
    nssm set Aria2 Description "aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink."
    
    # 或者简单创建
    nssm install Aria2 D:\aria2\aria2c.exe --conf=aria2.conf
    

NSSM 提供了更灵活和简单的方式来管理 Windows 服务,尤其是对于需要自定义参数的服务。

删除服务

NSSM 提供了 nssm remove 命令,可以删除服务。

# 弹出确认框(强制删除)
nssm remove <ServiceName>
# 不弹出确认框(静默删除)
nssm remove <ServiceName> confirm

例如:

nssm remove Aria2 confirm

管理服务

# 启动服务
nssm start <ServiceName>
# 停止服务
nssm stop <ServiceName>
# 重启服务
nssm restart <ServiceName>
# 查询服务状态
nssm status <ServiceName>
# 查询服务状态码
nssm statuscode <ServiceName>

nssm rotate <ServiceName>

nssm processes <ServiceName>

使用 Windows 系统内置命令工具

cmd 的 sc 命令(无法创建带启动参数的服务):

  1. 打开命令提示符(以管理员身份运行)。

  2. 使用 sc 命令创建服务,语法如下:

    sc create <ServiceName> binPath= "<Path to Executable>" DisplayName= "<Display Name>" start= <StartType>
    
    • <ServiceName>:服务的服务名,在服务列表中唯一,不可重复。
    • <Path to Executable>:服务运行的可执行文件的路径。
    • <Display Name>:服务的显示名称。
    • <StartType>:服务的启动类型,可以是 autodemand 或者 disabled

    注意:等号前不能有空格,等号后必须有空格

    例如:

    sc create MyService binPath= "C:\Path\To\MyService.exe" DisplayName= "MyService" start= auto
    
  3. 执行完成后,服务就会被创建。

  4. 使用 sc 命令查询服务,语法如下:

    sc query <ServiceName>
    
  5. 使用 sc 命令启动服务,语法如下:

    sc start <ServiceName>
    
  6. 使用 sc 命令停止服务,语法如下:

    sc stop <ServiceName>
    
  7. 使用 sc 命令删除服务,语法如下:

    sc delete <ServiceName>
    

    注意:

    • 先将服务停止再删除。
    • 删除成功后需要重启系统,服务才会从服务列表中删除。

PowerShell 的 New-Service 命令(无法创建带启动参数的服务):

创建服务:

  1. 打开 PowerShell(以管理员身份运行)。

  2. 使用 New-Service cmdlet 创建服务,语法如下:

    New-Service -Name <ServiceName> -BinaryPathName "<Path to Executable>" -StartupType <StartType>
    # 或更多设置
    New-Service -Name <ServiceName> -BinaryPathName "<Path to Executable>" -StartupType <StartType> -DisplayName "<Display Name>" -Description "<Description>"
    
    • <ServiceName>:你想要为服务指定的名称。
    • <Path to Executable>:服务运行的可执行文件的路径。
    • <StartType>:服务的启动类型,可以是 AutomaticManual 或者 Disabled
    • <Display Name>:服务的显示名称。
    • <Description>:服务的描述。

    例如:

    New-Service -Name MyService -BinaryPathName "C:\Path\To\MyService.exe" -StartupType Automatic
    
    New-Service -Name MyService -BinaryPathName "C:\Path\To\MyService.exe" -StartupType Automatic -DisplayName "My Service" -Description "This is my custom service"
    
  3. 执行完成后,服务就会被创建。

    查看服务列表:

    Get-Service
    

删除服务

sc delete <ServiceName>

需要重启系统,服务才会从服务列表中删除。

无论是哪种方法,创建服务后,可以使用 services.msc 命令或者服务管理器来管理这些服务。

posted @ 2024-04-14 13:02  飞仔FeiZai  阅读(392)  评论(0编辑  收藏  举报