V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AhFei
V2EX  ›  Windows

以 Windows 服务运行程序并开机自启 - 如 ServerStatus

  •  
  •   AhFei · 44 天前 · 1996 次点击
    这是一个创建于 44 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以 serverstatus 为例,介绍借助 shawl 将任何程序作为 Windows 服务运行,并实现开机自启。

    指标 描述
    适用系统 Windows 10/11
    走通流程时间 10 分钟

    shawl 运行任意程序作为 Windows 服务

    GitHub: mtkennerly/shawl: Windows service wrapper for arbitrary commands

    安装 shawl

    https://github.com/mtkennerly/shawl/releases 下载最新版本的压缩包,现在电脑基本都是 64 位,就下 shawl-v1.7.0-win64.zip 这种的。然后解压,里面有一个程序文件 shawl 。

    本文在桌面创建一个文件夹(C:/Users/AhFei/Desktop/serverstatus/),名称为 serverstatus ,将 shawl 移动到这个文件夹中,读者可自行选择这个文件夹创建的位置,但是选择好后就不能再移动,否则创建的服务无法运行。

    管理员权限打开命令行,后续会用到,可以使用下面步骤:

    1. Win + R 快捷键打开“运行”窗口( Win 就是徽标键,在空格左边,一般是一个窗口图案)
    2. 输入 cmd
    3. 再按住 ctrl+shift+enter ,会弹出框,允许后就会管理员权限运行了。
    4. 输入 cd C:/Users/AhFei/Desktop/serverstatus/ 进入 shawl 的安装文件夹,记得改成自己的路径。

    使用步骤

    以 serverstatus-rust 为例,在 Windows 上使用可以看这篇文章: Rust 版 ServerStatus 探针安装步骤 - 技焉洲 ,直接在命令行运行 serverstatus 的命令是:

    C:/Users/AhFei/Desktop/serverstatus/stat_client.exe -a "http://serverstatus.vfly2.com:8080/report" -u vfly2 -p 123
    

    先测试原程序本身能否执行,如果成功运行,就能用 shawl 将其包装成系统服务。


    用上面以管理员权限打开的命令行,添加系统服务:

    shawl add --name serverstatus -- C:/Users/AhFei/Desktop/serverstatus/stat_client.exe -a "http://serverstatus.vfly2.com:8080/report" -u vfly2 -p 123
    

    参数说明:

    • --name,系统服务名称,如果有空格,就用 "" 包裹
    • -- ,后面跟启动原程序的命令。

    然后,在 [任务管理器] - [服务] 中,就能找到新创建的 serverstatus 服务了。但是此时它还不能成功执行,也不能开机自启。

    使用 sc 设置开机自启

    sc 是 Service Control 的缩写,用于管理 Windows 服务,系统自带的工具。

    用上面以管理员权限打开的命令行,再执行 sc 命令。

    指定用户运行

    由于 serverstatus 需要获取系统的各种信息,默认的执行用户无权限运行,所以使用sc命令为服务配置指定用户:

    sc config [服务名称] obj= ".\AhFei" password= "你的密码"
    

    [服务名称] 替换为实际服务名,密码字段留空则使用空密码。需要注意:

    • 账户格式使用.\前缀表示本地计算机账户
    • 密码输入账号的密码,若使用空密码需保留空双引号""
    • 目标账户需具有"作为服务登录"的权限(可通过本地安全策略管理单元配置)

    如:

    sc config serverstatus obj=".\AhFei" password="456"
    

    安全提示:此方法会在系统日志中留下明文密码记录,建议仅用于测试环境。生产环境推荐使用组策略管理服务账户。

    设置完用户后,执行

    sc start serverstatus
    

    可以通过网页查看是否上线,或者查看 shawl 的日志,判断是否正常运行。正常运行则接着设置开机自启。

    想要关闭自然就是 sc stop serverstatus


    如果不行,比如密码中有特殊字符,可以在图形界面设置。

    在 [任务管理器] - [服务] 中,随便选一个服务右键,点 [打开服务] ,进入“服务”窗口,找到 serverstatus ,右键,点 [属性] - [登录] ,选择此账户,输入账号和密码即可。

    设置开机自启

    使用 sc 命令设置服务开机自动启动:

    sc config "服务名称" start=auto
    

    服务名称要完全正确(带空格的服务名需要加引号),start=后面直接跟参数,不要加空格。

    支持的启动类型参数:

    • auto (自动/延迟启动)
    • delayed-auto ( Win7 之后支持真正的自动启动)
    • demand (手动)
    • disabled (禁用)

    如:

    sc config serverstatus start=auto
    

    设置完成后建议运行sc qc 服务名查看确认配置是否生效。

    然后重启一下电脑,看开机后 serverstatus 是否能自动启动。


    原文链接: https://yanh.tech/2025/02/run-as-a-windows-service/

    版权声明:本博客所有文章除特別声明外,均为 AhFei 原创,采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 技焉洲 (yanh.tech)

    16 条回复    2025-02-11 08:24:44 +08:00
    yyzh
        1
    yyzh  
       44 天前   ❤️ 5
    一个 winsw 完成的事搞那么鬼复杂干嘛......
    sunshower
        2
    sunshower  
       44 天前 via Android
    这么麻烦 不如直接开机计划
    opengps
        3
    opengps  
       44 天前   ❤️ 2
    我感觉 nssm 更容易,所以也懒得再去看别的
    PrinceofInj
        4
    PrinceofInj  
       44 天前
    与老掉牙的 nssm 相比,解决了什么问题么?感觉 nssm 已经完美了,除了软件太过老旧,界面比较磕馋之外。
    Fish1024
        5
    Fish1024  
       44 天前
    winsw 就行了
    Tink
        6
    Tink  
       44 天前
    这么麻烦。。
    lujiaxing
        7
    lujiaxing  
       44 天前
    一个 winsw 完成的事搞那么鬼复杂干嘛......
    isnullstring
        8
    isnullstring  
       44 天前
    nssm 好像更简单
    Yanlongli
        9
    Yanlongli  
       44 天前
    nssm +1
    fanersai
        10
    fanersai  
       44 天前
    nssm +1
    hereted
        11
    hereted  
       44 天前
    我记得在`C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup` 创建快捷方式就可以开机自启了
    busier
        12
    busier  
       44 天前
    @hereted 你这叫“登陆桌面自启动”,算不得“开机自启动”。服务器这类不登陆桌面的情况你就无法运行了!
    hxy100
        13
    hxy100  
       44 天前
    @sunshower 计划任务不好使,Win32 服务有 Win32 服务的好处,比如进程意外中断可以自动恢复运行,你可以通过其他程序或软件像控制标准服务一样,控制服务暂停、停止、重新启动等等
    hxy100
        14
    hxy100  
       44 天前
    推荐 AnyExeToService: https://github.com/cxwl3sxl/AnyExeToService

    ----
    楼上诸位所说的 nssm 以前试过,好像不支持非标准 windows 服务接口编写的 exe ?
    ragnaroks
        15
    ragnaroks  
       43 天前
    以前也折腾过这种东西 https://www.ragnaroks.site/article/32/,后来还是直接 winsw 摆烂了,通过网页 UI 管理服务在 windows 上是个伪需求
    gearfox
        16
    gearfox  
       43 天前
    一只用 winsw
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5637 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 06:20 · PVG 14:20 · LAX 23:20 · JFK 02:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.