# servy-go **Repository Path**: aprilyu/servy-go ## Basic Information - **Project Name**: servy-go - **Description**: No description available - **Primary Language**: Go - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-30 - **Last Updated**: 2026-11-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
# Servy Go **把任意程序作为原生 Windows 服务运行** *Go 重写 · 中文界面 · 无运行时依赖 · 单个 10.8 MB 的 exe* [![Go](https://img.shields.io/badge/Go-1.21%2B-00ADD8?logo=go&logoColor=white)](https://go.dev) ![Platform](https://img.shields.io/badge/Windows-10%20%2F%20Server%202012%2B-0078D6?logo=windows&logoColor=white) ![License](https://img.shields.io/badge/License-MulanPSL--2.0-3DA639) ![Size](https://img.shields.io/badge/single%20binary-~10.8%20MB-blue) [特性](#features) · [快速开始](#quickstart) · [升级](#upgrade) · [架构文档](docs/architecture.md) Servy Go 主界面
--- ## 为什么做这个 [Servy](https://github.com/aelassas/servy)(C#)把"任意程序变成 Windows 服务"做得很好,但二选一: 要么用 2 MB 的 net48 包(依赖 .NET Framework 4.8),要么用 118 MB 的自包含包。 Servy Go 用 Go 重写了它最核心的能力,一个 **~10.8 MB 的 exe 同时承担图形界面、命令行 和服务宿主**,不需要任何运行时。 | | Servy 10.7(C#) | Servy Go | |---|---|---| | 运行时依赖 | .NET Framework 4.8 / 自包含包 118 MB | 无 | | 产物体积 | 2 MB(需运行时)/ 118 MB | ~10.8 MB | | 界面 | WPF(英文) | Win32 原生控件(中文) | | 配置载体 | SQLite + 常驻 Host 服务 + 命名管道 | SQLite,**无额外常驻服务** | | 数据位置 | `%ProgramData%` | exe 同级 `data\` 与 `logs\` | ## ✨ 特性 - 🎯 **托管任意程序** — 工作目录、启动参数、环境变量(支持 `%VAR%` 展开)、进程优先级、CPU 亲和性、启动类型(自动/延迟/手动/禁用) - 🛡 **进程树守护** — Job Object 整树清理,杜绝孤儿进程;故障自动重启(次数/间隔可配),SCM 层崩溃恢复兜底 - 📝 **日志** — stdout/stderr 重定向 + 按大小轮转;中文 Windows 下 GBK 输出自动转 UTF-8 - 📊 **资源监控** — 列表实时显示 CPU 与内存占用(与任务管理器同口径),默认不自动刷新,可选 10 秒 - 🔍 **搜索与批量** — 服务名/显示名模糊过滤;勾选多行批量启动、停止、重启、卸载 - 🖥 **原生 GUI + CLI** — walk(comctl32 原生控件),无 webview;CLI 支持 `--json` 供 CI/脚本消费 - 📦 **绿色部署** — 配置、日志全部在 exe 同级目录,换机器拷目录即迁移 ## 🚀 快速开始 ### 安装第一个服务 从 [Releases](../../releases) 下载 `servy.exe`,以管理员身份运行: ```powershell .\servy.exe install -name MyWeb -path "C:\apps\web\server.exe" -args="--port 8080" ``` 完成——服务已注册并启动。配置在 `data\servy.db`,日志在 `logs\`。 也可以直接双击 `servy.exe` 打开图形界面操作。 ### 常用命令 | 命令 | 说明 | |---|---| | `servy` | 打开图形界面 | | `servy list` / `status <名>` | 查看服务(`--json` 可选) | | `servy install / update / uninstall` | 注册、修改、移除 | | `servy start / stop / restart <名>` | 运行控制 | | `servy debug <名>` | 前台运行,不装服务即可验证配置 | 完整选项见 `servy help`;界面上的每个输入框都有悬停提示。 ### 从源码构建 ```powershell git clone <本仓库> cd servy-go .\build.ps1 # 测试 → 生成图标 → 编译到 dist\servy.exe ``` 需要 Go 1.21+;无需 cgo / gcc / Node / .NET。 ## ⬆️ 升级 Windows 会锁定正在运行的 exe,直接覆盖会提示"文件正在使用"。 把新 exe 和 `upgrade.ps1` 放到服务器上,以管理员身份运行: ```powershell .\upgrade.ps1 -NewExe D:\download\servy.exe ``` 脚本会自动停止依赖该文件的服务、替换文件、再按原状态重启,失败自动回滚。 依赖的服务会短暂中断几秒。详见 [upgrade.ps1](upgrade.ps1)。 ## 📖 文档 - [架构与实现](docs/architecture.md) — 模块地图、服务生命周期、状态机、关键设计决策与踩坑记录 ## ⚠️ 已知限制 - 被托管的 GUI 程序运行在 Session 0,桌面上看不到窗口——Windows 服务模型的限制,原版同样如此 - 服务账户固定 LocalSystem;自定义账户暂未支持 - 停止为强制终止进程树,无优雅协商(`WM_CLOSE`) - 未实现:pre/post 钩子、心跳 URL、事件日志上报、配置导入导出、PowerShell 模块 - 未签名的 Go 服务类程序容易被杀软误报,生产部署建议做代码签名 ## 致谢 架构思路与功能设计受 [Servy](https://github.com/aelassas/servy)(MIT)启发,代码为独立实现。 ## License [木兰宽松许可证 第2版(MulanPSL-2.0)](LICENSE)