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

216 天前
 AhFei

以 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

参数说明:

然后,在 [任务管理器] - [服务] 中,就能找到新创建的 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=后面直接跟参数,不要加空格。

支持的启动类型参数:

如:

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)

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

----
楼上诸位所说的 nssm 以前试过,好像不支持非标准 windows 服务接口编写的 exe ?
ragnaroks
215 天前
以前也折腾过这种东西 https://www.ragnaroks.site/article/32/,后来还是直接 winsw 摆烂了,通过网页 UI 管理服务在 windows 上是个伪需求
gearfox
215 天前
一只用 winsw

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1110106

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX