• Windows系统下设置程序开机自启(WinSW)


    介绍

    WinSW可以将Windows上的任何程序作为系统服务进行管理,已达到开机自启的效果。

    支持的平台

    WinSW需要运行在拥有.NET Framework 4.6.1或者更新版本的Windows平台下

    下载

    使用说明

    全局应用

    1. 获取WinSW.exe文件
    2. 编写myapp.xml文件(详细内容看[XML配置文件](# XML配置文件))
    3. 运行winsw install myapp.xml [options]安装服务,使其写入系统服务中
    4. 运行winsw start myapp.xml 开启服务
    5. 运行winsw status myapp.xml 查看服务的运行状态

    单一应用

    1. 获取WinSW.exe文件并将其更名为你的服务名(例如myapp.exe).
    2. 编写myapp.xml文件
    3. 请确保前面两个文件在同一目录
    4. 运行myapp.exe install [options]安装服务,使其写入系统服务中
    5. 运行myapp.exe start开启服务
    6. 运行myapp status myapp.xml 查看服务的运行状态

    命令

    除了使用说明中的installstartstatus三个命令外,WinSW还提供了其他的命令,具体命令及说明如下:

    • install:安装服务

    • uninstall:卸载服务

    • start:启动服务

    • stop:停止服务

    • restart:重启服务

    • status:检查服务状态

    • refresh:刷新服务属性

    • customize:自定义包装器可执行文件

    • dev:扩展命令(具体看下方)

    扩展命令:

    • dev ps:绘制与服务相关的进程树

    • dev kill:如果服务停止响应,则终止该服务

    • dev list:列出当前可执行文件管理的服务

    XML配置文件

    文件结构

    xml文件的根元素必须是 , 并支持以下的子元素

    例子:

    <service>
      <id>jenkinsid>
      <name>Jenkinsname>
      <description>This service runs Jenkins continuous integration system.description>
      <env name="JENKINS_HOME" value="%BASE%"/>
      <executable>javaexecutable>
      <arguments>-Xrs -Xmx256m -jar "%BASE%\jenkins.war" --httpPort=8080arguments>
      <log mode="roll">log>
    service>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    环境变量扩展

    配置 XML 文件可以包含 %Name% 形式的环境变量扩展。如果发现这种情况,将自动用变量的实际值替换。如果引用了未定义的环境变量,则不会进行替换。

    此外,服务包装器还会自行设置环境变量 BASE,该变量指向包含重命名后的 WinSW.exe 的目录。这对引用同一目录中的其他文件非常有用。由于这本身就是一个环境变量,因此也可以从服务包装器启动的子进程中访问该值。

    配置条目

    id

    必填 指定 Windows 内部用于标识服务的 ID。在系统中安装的所有服务中,该 ID 必须是唯一的,且应完全由字母数字字符组成。

    <id>jenkinsid>
    
    • 1

    executable

    必填 该元素指定要启动的可执行文件。它可以是绝对路径,也可以直接指定可执行文件的名称,然后从 PATH 中搜索(但要注意的是,服务通常以不同的用户账户运行,因此它的 PATH 可能与 shell 不同)。

    <executable>javaexecutable>
    
    • 1

    name

    可选项 服务的简短显示名称,可以包含空格和其他字符。该名称不能太长,如 ,而且在给定系统的所有服务中也必须是唯一的。

    <name>Jenkinsname>
    
    • 1

    description

    可选 对服务的长篇可读描述。当服务被选中时,它会显示在 Windows 服务管理器中。

    <description>This service runs Jenkins continuous integration system.description>
    
    • 1

    startmode

    可选 此元素指定 Windows 服务的启动模式。可以是以下值之一:自动或手动。有关详细信息,请参阅 [ChangeStartMode](Win32_Service 类的 ChangeStartMode 方法 (CIMWin32 WMI 提供程序) - Win32 apps | Microsoft Learn) 方法。默认值为自动Automatic

    delayedAutoStart

    可选 如果定义了Automatic模式,此布尔选项将启用延迟启动模式。更多信息,请参阅Startup Processes and Delayed Automatic Start

    请注意,该启动模式不适用于 Windows 7 和 Windows Server 2008 以上的旧版本。在这种情况下,Windows 服务安装可能会失败。

    <delayedAutoStart>truedelayedAutoStart>
    
    • 1

    depend

    可选 指定此服务依赖的其他服务的 ID。当服务 X 依赖于服务 Y 时,X 只能在 Y 运行时运行。

    可使用多个元素指定多个依赖关系。

    <depend>Eventlogdepend>
    <depend>W32Timedepend>
    
    • 1
    • 2

    log

    可选 用 和启动模式设置不同的日志目录:append(默认)、reset(清除日志)、ignore(忽略)、roll(移动到 *.old)。

    更多信息,请参阅Logging and error reporting

    <log mode="roll">log>
    
    • 1

    arguments

    可选 元素指定要传递给可执行文件的参数。

    <arguments>arg1 arg2 arg3arguments>
    
    • 1

    或者

    <arguments>
      arg1
      arg2
      arg3
    arguments>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    stopargument/stopexecutable

    可选 当服务被请求停止时,winsw 会简单地调用 TerminateProcess function立即杀死服务。但是,如果存在 元素,winsw 将使用指定的参数启动另一个 进程(或 ,如果已指定),并期望该进程启动服务进程的优雅关闭。

    然后,Winsw 将等待这两个进程自行退出,然后向 Windows 报告服务已终止。

    使用 时,必须使用 而不是 。

    <executable>catalina.shexecutable>
    <startarguments>jpda runstartarguments>
    
    <stopexecutable>catalina.shstopexecutable>
    <stoparguments>stopstoparguments>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Additional commands

    扩展命令包括prestart,poststart,prestop,poststop四个,以prestart为例写法如下:

    <prestart>
      <executable>executable>
      <arguments>arguments>
      <stdoutPath>stdoutPath>
      <stderrPath>stderrPath>
    prestart>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • prestart:在服务启动时、主进程启动前执行

    • poststart:在服务启动时和主程序启动后执行

    • prestop:在服务停止时、主进程停止前执行

    • poststop:在服务停止时和主进程停止后执行

    共用的命令如下:

    • stdoutPath:指定将标准输出重定向到的路径

    • stderrPath:指定将标准错误输出重定向到的路径

    在 stdoutPath 或 stderrPath 中指定 NUL 可处理相应的数据流

    preshutdown

    当系统关闭时,让服务有更多时间停止。

    系统默认的预关机超时时间为三分钟。

    <preshutdown>falsepreshutdown>
    <preshutdownTimeout>3 minpreshutdown>
    
    • 1
    • 2

    stoptimeout

    当服务被请求停止时,winsw 会首先尝试向控制台应用程序发送 Ctrl+C 信号,或向 Windows 应用程序发布关闭消息,然后等待长达 15 秒的时间,让进程自己优雅地退出。如果超时或无法发送信号或消息,winsw 就会立即终止服务。

    通过这个可选元素,您可以更改 "15 秒 "的值,这样就可以控制 winsw 让服务自行关闭的时间。

    <stoptimeout>10secstoptimeout>
    
    • 1

    Environment

    如有必要,可多次指定该可选元素,以指定要为子进程设置的环境变量。

    <env name="HOME" value="c:\abc" />
    
    • 1

    interactive

    如果指定了此可选元素,则允许服务与桌面交互,如显示新窗口和对话框。

    <interactive>trueinteractive>
    
    • 1

    请注意,自引入 UAC(Windows Vista 及以后版本)以来,服务已不再真正允许与桌面交互。在这些操作系统中,这样做的目的只是让用户切换到一个单独的窗口站来与服务交互。

    beeponshutdown

    该可选元素用于在服务关闭时发出simple tones。此功能只能用于调试,因为某些操作系统和硬件不支持此功能。

    <beeponshutdown>truebeeponshutdown>
    
    • 1

    download

    可以多次指定这个可选元素,以便让服务包装器从 URL 获取资源并将其作为文件放到本地。此操作在服务启动时,即 指定的应用程序启动前运行。

    对于需要身份验证的服务器,必须根据身份验证类型指定一些参数。只有基本身份验证需要额外的子参数。支持的身份验证类型有

    • none(无):默认值,不得指定

    • sspi:Windows Security Support Provider Interface,包括 Kerberos、NTLM 等。

    • basic:基本身份验证,子参数:

      • user=“UserName” 用户名

      • password=“Passw0rd”

      • unsecureAuth=“true”: 默认值=“false”

    参数 unsecureAuth 仅在传输协议为 HTTP(未加密数据传输)时有效。这是一个安全漏洞,因为凭据是以明文发送的!对于 SSPI 身份验证来说,这并不重要,因为身份验证令牌是加密的。

    对于使用 HTTPS 传输协议的目标服务器来说,颁发服务器证书的 CA 必须得到客户端的信任。当服务器位于互联网上时,通常会出现这种情况。当一个组织在内部网中使用自行签发的 CA 时,情况可能并非如此。在这种情况下,有必要将 CA 导入 Windows 客户端的证书 MMC。请参阅 "Manage Trusted Root Certificates"中的说明。必须将自行签发的 CA 导入计算机的可信根证书颁发机构。

    默认情况下,如果操作失败(如从不可用),下载命令不会导致服务启动失败。为了在这种情况下强制下载失败,可以指定 failOnError 布尔属性。

    要指定自定义代理,请使用参数 proxy,格式如下:

    • 有凭据:http://USERNAME:PASSWORD@HOST:PORT/。

    • 无凭据: http://HOST:PORT/。

    <download from="http://example.com/some.dat" to="%BASE%\some.dat" />
    
    <download from="http://example.com/some.dat" to="%BASE%\some.dat" failOnError="true"/>
    
    <download from="http://example.com/some.dat" to="%BASE%\some.dat" proxy="http://192.168.1.5:80/"/>
    
    <download from="https://example.com/some.dat" to="%BASE%\some.dat" auth="sspi" />
    
    <download from="https://example.com/some.dat" to="%BASE%\some.dat" failOnError="true"
              auth="basic" user="aUser" password="aPassw0rd" />
    
    <download from="http://example.com/some.dat" to="%BASE%\some.dat"
              proxy="http://aUser:aPassw0rd@192.168.1.5:80/"
              auth="basic" unsecureAuth="true"
              user="aUser" password="aPassw0rd" />
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这是开发自我更新服务的另一个有用的组成部分。

    自 2.7 版起,如果目标文件存在,WinSW 将在 If-Modified-Since 标头中发送其最后写入时间,如果收到 304 Not Modified,则跳过下载。

    onfailure

    当 winsw 启动的进程失败(即以非零退出代码退出)时,这个可选的可重复元素将控制其行为。

    <onfailure action="restart" delay="10 sec"/>
    <onfailure action="restart" delay="20 sec"/>
    <onfailure action="reboot" />
    
    • 1
    • 2
    • 3

    例如,上述配置会导致服务在第一次故障后 10 秒内重新启动,在第二次故障后 20 秒内重新启动,然后如果服务再次发生故障,Windows 将重新启动。

    每个元素都包含一个强制的 action 属性和可选的 delay 属性,前者用于控制 Windows SCM 将采取的行动,后者用于控制采取该行动前的延迟时间。action 的合法值为

    • restart:重新启动服务

    • reboot:重新启动 Windows。将显示带有 CRITICAL_PROCESS_DIED 错误检查代码的蓝色屏幕

    • none:不执行任何操作,让服务停止延迟属性的可能后缀为秒/秒/分钟/分钟/小时/小时/天/天。如果缺少,延迟属性默认为 0。

    延迟属性的后缀可能是秒/秒/分/分/小时/小时/天/天。如果缺少,延迟属性默认为 0。

    如果服务不断发生故障,并且超过了配置的 次数,则会重复上次的操作。因此,如果只想始终自动重启服务,只需像这样指定一个 元素即可:

    <onfailure action="restart" />
    
    • 1

    resetfailure

    此可选元素控制 Windows SCM 重置故障计数的时间。例如,如果您指定 1 小时,而服务持续运行的时间超过一小时,那么故障计数将重置为零。

    换句话说,这是您认为服务成功运行的持续时间。默认为 1 天。

    <resetfailure>1 hourresetfailure>
    
    • 1

    Security descriptor

    SDDL 格式的服务安全描述符字符串。

    有关详细信息,请参阅安全描述符定义语言

    <securityDescriptor>securityDescriptor>
    
    • 1

    Service account

    服务默认安装为 LocalSystem 账户。如果您的服务不需要很高的权限级别,可以考虑使用 LocalService 账户NetworkService 帐户或用户账户。

    要使用用户账户,请像这样指定 元素:

    <serviceaccount>
      <username>DomainName\UserNameusername>
      <password>Pa55w0rdpassword>
      <allowservicelogon>trueallowservicelogon>
    serviceaccount>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    的格式为 DomainName\UserName 或 UserName@DomainName。如果账户属于内置域,则可以指定 .\UserName。

    是可选项。如果设置为 true,将自动为列出的账户设置 "允许以服务身份登录 "的权限。

    要使用Group Managed Service Accounts Overview,请在账户名后追加 $ 并删除 元素:

    <serviceaccount>
      <username>DomainName\GmsaUserName$username>
      <allowservicelogon>trueallowservicelogon>
    serviceaccount>
    
    • 1
    • 2
    • 3
    • 4
    LocalSystem account

    要明确使用LocalSystem 帐户 ,请指定以下内容:

    <serviceaccount>
      <username>LocalSystemusername>
    serviceaccount>
    
    • 1
    • 2
    • 3

    请注意,该账户没有密码,因此提供的任何密码都将被忽略。

    LocalService account

    要使用 LocalService 帐户,请指定以下内容:

    <serviceaccount>
      <username>NT AUTHORITY\LocalServiceusername>
    serviceaccount>
    
    • 1
    • 2
    • 3

    请注意,该账户没有密码,因此提供的任何密码都将被忽略。

    NetworkService account

    要使用 NetworkService 帐户,请指定以下内容:

    <serviceaccount>
      <username>NT AUTHORITY\NetworkServiceusername>
    serviceaccount>
    
    • 1
    • 2
    • 3

    请注意,该账户没有密码,因此提供的任何密码都将被忽略。

    prompt

    可选。提示输入用户名和密码。

    <serviceaccount>
      <prompt>dialog|consoleprompt>
    serviceaccount>
    
    • 1
    • 2
    • 3
    • 话框:使用对话框进行提示。

    • 控制台:在控制台进行提示。

    Working directory

    某些服务在运行时需要指定工作目录。为此,请像这样指定元素:

    <workingdirectory>C:\applicationworkingdirectory>
    
    • 1

    Priority

    可选择指定服务进程的调度优先级(相当于 Unix nice),可选值包括idle, belownormal, normal, abovenormal, high, realtime(不区分大小写)。

    <priority>idlepriority>
    
    • 1

    指定高于正常值的优先级会产生意想不到的后果。有关详细信息,请参阅 .NET 文档中的 ProcessPriorityClass 枚举。此功能的主要目的是以较低的优先级启动进程,以免干扰计算机的交互式使用。

    Auto refresh

    <autoRefresh>trueautoRefresh>
    
    • 1

    当服务启动或执行以下命令时,自动刷新服务属性:

    • start
    • stop
    • restart

    默认值为 true。

    sharedDirectoryMapping

    默认情况下,即使在 Windows 服务配置文件中进行了配置,Windows 也不会为服务建立共享驱动器映射。由于域策略的原因,有时无法解决这个问题。

    这样就可以在启动可执行文件之前映射外部共享目录。

    <sharedDirectoryMapping>
      <map label="N:" uncpath="\\UNC" />
      <map label="M:" uncpath="\\UNC2" />
    sharedDirectoryMapping>
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口
    使用 Tess4J 实现本地与远程图片的文字识别
    决策树可视化-graphviz安装
    shell 运算符
    C++入门(二)
    Google Authenticator 和gitlab使用的方法配置Google AuthenticatorGoogle
    New Coins
    【组件库】element-plus组件库
    纷享销客数字化营销(一):企业专属微站和员工智能名片
    Leetcode160. 相交链表(双指针)
  • 原文地址:https://blog.csdn.net/huangge1199/article/details/133888221