[开源] 造了个场景很窄的小众 CLI 工具 servctl:不装 Docker/Supervisor,一条命令把裸机二进制程序注册为 systemd 服务

reedtang666 2026-10-25 23:26 1

先叠个甲:这是一个使用范围比较窄、非常小众的命令行小工具。


如果你的生产环境已经在用 K8s 、Docker Compose 、Ansible 或者 1Panel 面板,那完全不需要看这个项目;它只服务于一个很具体的“裸机轻量部署”小场景。




🎯 什么场景下会用到它?


平时写完一个 Go 编译出来的单文件二进制、或者一个小脚本,丢到一台内存不大的 Ubuntu VPS 上跑的时候:



  1. 不想为了跑一两个几十 MB 的小后端去装一整套 Docker ,也不想装 Supervisor / PM2 多跑一个常驻守护进程吃内存;

  2. 最干净的做法其实就是交给 Linux 原生的 systemd 托管,日志交给 journald;

  3. 但每次去 /etc/systemd/system/ 手写 .service 配置文件、配 WorkingDirectory、配 Restart=on-failure、设运行用户,再敲一串 daemon-reload -> enable -> start -> journalctl 真的很繁琐。


所以我用 Go 写了个零第三方依赖的小工具 servctl:本质上就是一个克制的 systemd 包装器,帮你用一条命令走完“校验 -> 生成 unit -> 启动并设置自启 -> 观察存活 -> 日常看日志/启停”的闭环。


🔗 项目地址


GitHub: https://github.com/9star-academy/servctl
(纯 Go 标准库编写,无任何第三方依赖,如果刚好戳中你的小众需求,欢迎点个 Star ⭐ 支持!)




🚀 它是怎么工作的?


1. 安装 CLI (仅支持 Linux amd64 / arm64 + systemd 环境)


curl -fsSL https://raw.githubusercontent.com/9star-academy/servctl/main/scripts/install.sh | sudo bash

2. 一条命令把可执行文件注册成系统服务


比如你把编译好的程序传到了 /www/wwwroot/myapp/myapp:


sudo servctl install myapp \
--exec /www/wwwroot/myapp/myapp \
--workdir /www/wwwroot/myapp \
--user ubuntu

如果需要给程序传启动参数(比如端口),直接跟在 -- 后面(原样透传,不经过 shell 展开):


sudo servctl install myapp \
--exec /www/wwwroot/myapp/myapp \
--workdir /www/wwwroot/myapp \
--user ubuntu \
-- --port 8200

3. 日常管理命令


servctl status myapp                # 查看状态
sudo servctl logs myapp # 查看最近 50 行日志
sudo servctl logs myapp --follow # 实时滚动看日志
sudo servctl restart myapp # 重启
sudo servctl stop myapp # 停止(保留开机自启)
sudo servctl start myapp # 启动
sudo servctl uninstall myapp # 卸载服务(只删 unit ,绝不碰你的业务文件和日志)



🛡️ 几个刻意做得很克制的设计边界


因为定位就是小而专,所以明确做了不少限制和防呆:



  • 启动观察 2 秒 + 失败回滚:install 启动后会观察进程 2 秒,如果因为配置错或端口冲突直接崩了,会自动打印日志并回滚清掉刚建的 unit ,不留垃圾。

  • 绝不污染系统原有服务:生成的 unit 带有专属标记,servctl 严禁覆盖同名系统服务(比如 nginx、ssh),也不允许操作非它创建的普通服务。

  • 强制非 root 显式指定用户:必须带 --user 指定运行账户,避免习惯性用 root 裸跑业务进程。

  • 明确不做的事:不接管 Nginx 反代、不改防火墙、不搞零停机热更新、不跑自己的守护进程。


总之就是一个只干好“把单机二进制塞进 systemd”这一件事的小锤子,代码很薄,欢迎同样喜欢裸机跑小服务的老哥体验交流!

最新回复 (2)
  • qwx 10-26 09:29
    1楼
    servctl 严禁覆盖同名系统服务(比如 nginx 、ssh ),也不允许操作非它创建的普通服务。
    --建议增加个 list ,毕竟可能会创建很多的服务
  • reedtang666 楼主 10-26 10:06
    2楼
    @qwx 感谢建议!当前版本已经禁止覆盖已有同名服务,也不允许操作非 servctl 创建的服务。list 的建议很实用,我会补上,只列出 servctl 创建的服务,并显示运行状态和开机自启状态,包含已停止和失败的服务。
* 帖子来源V2EX
返回