利用用WinSW将exe程序注册为系统服务

利用用WinSW将exe程序注册为系统服务

适用场景:将任意 Windows 可执行程序(exe、jar、bat、python 脚本等)注册为系统后台服务,实现开机自启、异常重启、后台静默运行,无需手动登录启动程序。

文档用途:个人学习留存、快速查阅 WinSW 安装配置、命令操作、问题排查,适配所有 Windows 服务器/个人电脑。

WinSW 简介:WinSW 是一款开源的 Windows 服务包装工具,可将普通应用程序封装为 Windows 原生服务,完美解决程序后台运行、开机自启、崩溃自愈需求,轻量无依赖、配置简单、稳定性高。

一、环境准备

  • 系统要求:Windows 10 / Windows 11 / Windows Server 2016+

  • 运行依赖:.NET Framework 4.8(大部分Windows系统自带,缺失可微软官网免费安装)

  • 权限要求:所有操作必须以 管理员身份运行 CMD / PowerShell

二、WinSW 下载与安装

2.1 官方下载地址

GitHub 官方 Releases:https://github\.com/winsw/winsw/releases

版本选择规则:

  • 64位系统:下载 WinSW-x64.exe

  • 32位系统:下载 WinSW-x86.exe

  • 通用极简版:优先选择最新稳定版

2.2 目录部署(固定规范)

为方便管理,建议统一程序目录,目录全程无中文、无空格(避免报错)。

示例部署目录:D:\Software\WinSW\

  1. 将下载的 WinSW-x64.exe 放入上述目录

  2. 重命名文件(核心规范):将 WinSW-x64.exe 重命名为 service.exe

  3. 在同目录新建 同名配置文件:service.xml(必须和exe文件名一致)

最终目录文件结构:

Text
1
2
3
D:\Software\WinSW\
├─ service.exe # WinSW 主程序
└─ service.xml # 服务配置文件

三、核心配置文件(service.xml)详解

配置文件是 WinSW 核心,所有服务运行规则均在此配置,以下为通用万能模板,可直接修改使用。

3.1 基础通用配置模板

Text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<service>
<id>MyAppService</id>
<name>MyApp 后台服务</name>
<description>通过WinSW封装的自定义后台服务,开机自启、异常自动重启</description>
<executable>D:\Software\MyApp\run.exe</executable>
<arguments></arguments>
<workingdirectory>D:\Software\MyApp</workingdirectory>

<!-- 开机启动类型:auto自动 / manual手动 -->
<startservice>auto</startservice>

<!-- 程序崩溃自动重启配置 -->
<onfailure action="restart" delay="10 sec"/>
<restartreset>60 sec</restartreset>

<!-- 日志输出配置 -->
<logpath>D:\Software\WinSW\logs</logpath>
<logmode>rotate</logmode>
</service>

3.2 关键参数说明(必看)

参数节点 作用说明 填写规范
id 服务唯一标识 英文无空格,系统唯一,不可重复
name 服务显示名称 服务列表展示的名称,可中文
description 服务描述 备注服务用途,方便识别
executable 要托管的程序路径 绝对路径,无中文空格,exe/jar/bat等
arguments 程序启动参数 无参数则留空,有参数直接填写
workingdirectory 程序运行根目录 填写程序所在文件夹绝对路径
startservice 开机启动方式 auto开机自启,manual手动启动
onfailure 崩溃重启规则 delay重启延迟,推荐10秒
logpath 日志保存目录 自动生成运行日志、错误日志
logmode 日志切割模式 rotate自动轮转,避免日志过大

3.3 特殊场景适配配置

场景1:托管 Java Jar 程序

Text
1
2
3
<executable>java</executable>
<arguments>-jar D:\Software\Java\app.jar</arguments>
<workingdirectory>D:\Software\Java</workingdirectory>

场景2:托管 Python 脚本

Text
1
2
3
<executable>python</executable>
<arguments>D:\Software\Py\run.py</arguments>
<workingdirectory>D:\Software\Py</workingdirectory>

场景3:托管 Bat 批处理文件

Text
1
2
3
<executable>cmd</executable>
<arguments>/c D:\Software\Bat\start.bat</arguments>
<workingdirectory>D:\Software\Bat</workingdirectory>

四、WinSW 核心命令大全(管理员终端执行)

先 CD 切换到 WinSW 所在目录:cd D:\Software\WinSW\

4.1 基础服务操作命令

  • 安装服务:service install

  • 启动服务:service start

  • 停止服务:service stop

  • 重启服务:service restart

  • 查看服务状态:service status

  • 卸载服务:service uninstall

  • 刷新配置(修改xml后生效):service refresh

4.2 辅助命令

  • 查看帮助:service help

  • 校验配置文件是否正确:service verify

五、完整实战部署流程

以部署任意自定义程序为例,完整步骤如下:

  1. 整理程序目录,确保路径无中文、无空格、无特殊符号

  2. 部署并重命名 WinSW 程序,编写完善 service.xml 配置文件

  3. 管理员身份打开 CMD,CD 进入 WinSW 目录

  4. 执行校验命令,排查配置错误:service verify

  5. 安装服务:service install

  6. 启动服务:service start

  7. 查看运行状态:service status

  8. 验证:打开 Windows 服务列表,确认服务正常运行

六、Windows 服务列表查看方式

快捷键 Win + R,输入 services.msc 回车,即可打开系统服务面板,可查看、启停、设置服务启动类型。

七、常见报错与问题排查

7.1 服务启动失败、报错1053

原因:程序路径错误、配置文件格式错误、路径含中文/空格、权限不足

解决方案:

  • 全程使用管理员终端操作

  • 检查 xml 配置文件路径绝对正确,无中文空格

  • 执行 service verify校验配置语法

  • 手动运行一次目标程序,确认程序本身可正常启动

7.2 服务安装成功但无法启动

解决方案:查看 logs 日志目录下的错误日志,根据日志报错精准定位问题(端口占用、参数错误、文件缺失等)。

7.3 修改配置后不生效

必须执行刷新命令:service refresh,重启服务即可生效。

7.4 卸载服务提示服务正在运行

先执行 service stop 停止服务,再执行 service uninstall 卸载。

八、最佳实践与注意事项

  • 目录规范:所有相关目录、文件名称禁止中文、空格、特殊符号,避免90%的报错

  • 权限规范:所有命令操作必须管理员身份运行,否则安装/启动失败

  • 配置规范:exe与xml文件名必须完全一致,同目录存放

  • 日志规范:固定日志目录,方便后续问题排查,定期清理日志

  • 更新程序:更新目标程序后,无需重装服务,重启服务即可

  • 多服务部署:多个服务需新建独立文件夹,单独配置xml,服务id不可重复

九、版本更新记录

2025-09-30:整理完整版教程,包含基础配置、多场景适配、命令大全、问题排查,个人长期留存使用

(注:部分内容由豆包工作 AI 生成)

我的配置:

一直使用linux,在配置服务时习惯了systemd进行配置,转入windows时,想办法解决,找到WinSW。我配置frp和WebDav的配置

1.Frpc

1
C:\Program Files\frpc

将winsw.exe、winsw.xml放入程序目录,配置winsw.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<service>
<!-- 应用ID唯一 -->
<id>frpc</id>
<!-- 应用名称 -->
<name>frpc</name>
<!-- 应用描述 -->
<description>frp客户端</description>
<!-- 执行命令 -->
<executable>"C:\Program Files\frpc\frpc.exe"</executable>
<!-- 执行命令后面追加的参数 -->
<arguments>"C:\Program Files\frpc\frpc.exe"</arguments>
<!-- 第1次启动失败的操作,delay启动失败重试间隔时间 -->
<onfailure action="restart" delay="10 sec"/>
<!-- 第2次启动失败的操作,delay启动失败重试间隔时间 -->
<onfailure action="restart" delay="10 sec"/>
<!-- 记录日志 -->
<log mode="none"/>
</service>

踩坑的地方:”C:\Program Files\frpc\frpc.exe”和”C:\Program Files\frpc\frpc.exe”,因为有空格,所以要用引号引导起来,不然启动不了。

1
2
3
4
5
6
winsw.exe install #注册服务
winsw.exe start #启动服务
winsw.exe uninstall #卸载服务
winsw.exe stop #停止服务
winsw.exe restart #重启服务
winsw.exe status #查看服务状态

2.WebDav

1
C:\Program Files\webdav

将winsw.exe、winsw.xml放入程序目录,配置winsw.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<service>
<!-- 应用ID唯一 -->
<id>webdav</id>
<!-- 应用名称 -->
<name>webdav</name>
<!-- 应用描述 -->
<description>webdav</description>
<!-- 执行命令 -->
<executable>"C:\Program Files\webdav\webdav.exe"</executable>
<!-- 执行命令后面追加的参数 -->
<arguments>--config "C:\Program Files\webdav\webdav.yml"</arguments>
<!-- 第1次启动失败的操作,delay启动失败重试间隔时间 -->
<onfailure action="restart" delay="10 sec"/>
<!-- 第2次启动失败的操作,delay启动失败重试间隔时间 -->
<onfailure action="restart" delay="10 sec"/>
<!-- 记录日志 -->
<log mode="none"/>
</service>

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

赏

×

喜欢就点赞,疼爱就打赏