以 Windows 服务运行程序并开机自启 - 如 ServerStatus - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AhFei
V2EX    Windows

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

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

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

    ----
    楼上诸位所说的 nssm 以前试过,好像不支持非标准 windows 服务接口编写的 exe ?
    ragnaroks
        15
    ragnaroks  
       281 天前
    以前也折腾过这种东西 https://www.ragnaroks.site/article/32/,后来还是直接 winsw 摆烂了,通过网页 UI 管理服务在 windows 上是个伪需求
    gearfox
        16
    gearfox  
       280 天前
    一只用 winsw
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     925 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 20:34 PVG 04:34 LAX 12:34 JFK 15:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86