Super (superd):基于 Rust 的轻量级进程编排器实践

发布时间: 更新时间: 总字数:3357 阅读时间:7m 作者:IP:上海 网址

本文介绍基于 Rust 构建的 API 优先(API-First)轻量级进程编排器 Super(守护进程 superd + 客户端 super):涵盖一键安装脚本的工作机制、日常进程管理的常用 CLI 命令、SUPER_ROOT 实例根目录的布局与解析顺序,以及通过 systemctl 查看 systemd 服务单元中环境变量的实用技巧,可作为替代 Supervisor、PM2 的进程托管方案参考。

工具简介

Super(MIT 协议)定位为 “The API-First, Lightweight Process Orchestrator for the Edge”,由两个静态编译的 Rust 二进制组成:

  • superd:守护进程,负责进程生命周期托管、健康检测、崩溃重启、日志汇聚,并对外暴露 REST API、WebSocket 与 Unix Socket;
  • super:控制客户端,本身不直接拉起进程,而是 superd HTTP API 的官方客户端。

它面向"只有几个常驻进程"的小型 VPS、边缘盒子、嵌入式设备与容器场景,目标是替代 Python Supervisor、PM2、Monit 等传统方案——不需要 Python 解释器或 Node.js/JVM 运行时,零外部依赖。

核心特性

以下特性均以官方文档为准:

  • 单二进制 & 零运行时依赖:Rust 静态编译,极低内存与 CPU 开销;
  • 全语言托管:可管理任意命令行程序(Node.js、Python、Go、Shell 等);
  • 声明式配置:主配置为 $SUPER_ROOT/conf/super.toml(TOML),子服务通过 [include].files 加载 conf/conf.d/*.toml 栈文件,super reload 热加载;
  • 健康检查探针:原生支持 TCP、HTTP(仅接受 http:// / https://,状态码 200~299 视为成功)与 Exec 三类探针;
  • 弹性自愈:兼容 Supervisor 的 autorestart / exitcodes / startsecs 语义;连续崩溃重启次数由 retry_limit(默认 3 次)约束,超限后进程标记为 Fatal 并停用 autostart;另有防抖机制(flapping_window 默认 60 秒内最多 flapping_threshold 5 次重启);
  • API 优先:REST API + WebSocket 实时日志流,默认仅监听回环地址 127.0.0.1:9002;可选 Unix Socket(run/superd.sock,权限默认 0600,配置为 0666 会被直接拒绝启动);
  • 事件持久化:全部生命周期事件(崩溃、退出、恢复、健康重启、cron 执行等)写入 SQLite(默认 data/events.db,WAL 模式),默认保留 30 天(events_keep_days),通过 super events 查询;
  • OTA 事务式更新:备份 → 校验 → 切换 → 健康窗口内不通过自动回滚;下载强制 HTTPS 并阻断云元数据地址;
  • 平滑迁移:内置 super import supervisor 可导入既有 Supervisor 配置并输出 diff 预览。

安装

官方提供一键安装脚本(内置 SHA-256 校验,自动创建目录并注册系统服务)。生产环境推荐先下载审计、再执行的两步安装方式:

bash
# 1. 下载安装脚本并审计内容
curl -fsSL https://github.com/schiplat/super/releases/latest/download/install.sh -o install.sh
less install.sh

# 2. 审计无误后执行安装
sh install.sh

[!WARNING] 上游 README 亦提供远程脚本直接管道执行的一行式安装。该方式会以当前用户权限直接执行远程脚本,虽然脚本内部对下载的发布包做了基于 SHA256SUMS 的完整性校验,生产环境仍建议采用上述先审计后执行的方式,或从 Releases 手动下载对应平台(Linux x86_64/arm64、macOS、FreeBSD)的 tar.gz 包安装。

脚本默认行为:

  • 安装 superd 与 super 到 $PREFIX/bin:root 或 /usr/local/bin 可写时为 /usr/local/bin,普通用户则为 ~/.local/bin;
  • 创建实例根目录 SUPER_ROOT:系统级为 /opt/super,用户级为 ~/.super,并写入最小布局(conf/、data/、logs/、run/、plugins/)与默认配置 conf/super.toml;
  • 注册并启用开机自启服务:Linux 为 systemd(superd.service),macOS 为 launchd(com.schiplat.superd),FreeBSD 为 rc.d。

脚本支持的常用选项:

选项作用
--version安装指定版本
--prefix DIR自定义二进制安装前缀
--root DIR自定义 SUPER_ROOT 实例根目录
--user强制用户级安装(user systemd / LaunchAgent)
--system强制系统级安装
--no-service跳过 systemd / launchd 服务注册
--no-start安装服务但不立即启动
--no-init不创建 SUPER_ROOT 目录布局与默认配置

日常进程管理

以下命令均已对照 CLI 源码(cli/src/args.rs)核实:

bash
# 查看所有托管进程列表及状态
super list

# 添加并启动新服务(--autostart 为布尔开关,默认 true;其后为待托管命令)
super add --name api-server --autostart /opt/app/api

# 启动 / 停止 / 重启某服务
super start api-server
super stop api-server
super restart api-server

# 停止时等待进程真正退出(最多 10 秒,超时后 SIGKILL)
super stop api-server --wait --timeout 10

# 查看日志:先读取最近 50 行,再通过 WebSocket 持续跟随
super logs api-server --tail 50 -f

# 热加载配置(无参数时重载系统配置及 conf.d 栈文件)
super reload

# 离线校验配置文件(默认探测 ./conf/super.toml 或 /etc/super/super.toml)
super check

# 诊断本机安装与运行中的守护进程(配置、连通性等)
super doctor

其他实用子命令:super events(查询 SQLite 历史事件)、super top(类 htop 实时监控)、super export(导出当前配置为栈文件)、super shutdown(停止守护进程)、super import supervisor <conf> --dry-run(预览 Supervisor 配置迁移)。

理解 SUPER_ROOT:实例根目录

SUPER_ROOT 是 Super 的实例根目录(Instance Root),用于存放配置、日志、运行时文件与数据,由 superd、super CLI 及授权插件共享,保证路径解析一致。所有相对路径(如 Unix Socket run/superd.sock、PID 文件 run/superd.pid、事件库 data/events.db、栈文件通配 conf/conf.d/*)均基于该目录解析。

守护进程的解析顺序(官方 environment-variables.md):

  1. SUPER_ROOT 环境变量(已设置且非空时优先);
  2. 依据可执行文件位置推断(<root>/bin/superd 存在则取 <root>);
  3. 当前工作目录。

默认目录布局:

text
$SUPER_ROOT/
├── conf/
│   ├── super.toml       # 主配置文件
│   └── conf.d/          # 子服务栈文件(TOML,兼容 JSON)
├── logs/                # 守护进程日志(app.log)与子进程输出
├── data/                # SQLite 事件库(events.db)与快照(snapshot.json)
├── run/                 # Unix Socket(superd.sock)/ PID 文件(superd.pid)
└── plugins/             # 授权插件目录(.so / .dylib)

通过 systemd 查看 SUPER_ROOT

系统级安装时,SUPER_ROOT 由 systemd 单元文件以 Environment= 注入。查看单元内容的命令为:

bash
systemctl cat superd

(服务全称为 superd.service,省略后缀效果相同。)

真实输出样例(系统级安装位于 /etc/systemd/system/superd.service,内容摘自 install.sh 生成的模板):

ini
[Unit]
Description=Project Super Process Manager
Documentation=https://super.docs.sconts.com/docs/
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
# Must stay in the foreground. Do not set [server].daemon = true or pass --daemon.
ExecStart=/usr/local/bin/superd --foreground
Restart=on-failure
RestartSec=2
Environment="SUPER_ROOT=/opt/super"
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

几个值得注意的字段:

  • Type=simple + --foreground:单元模板明确要求守护进程保持前台运行,禁止配置 [server].daemon = true 或传入 --daemon(systemd 场景下自守护化会干扰进程管理);
  • Environment="SUPER_ROOT=/opt/super":实例根目录在此注入;用户级安装时单元位于 ~/.config/systemd/user/superd.service,SUPER_ROOT 为 ~/.super,WantedBy 相应变为 default.target;
  • Restart=on-failure + RestartSec=2:仅在异常退出时重启,间隔 2 秒。

实用衍生命令:

bash
# 仅提取过滤 SUPER_ROOT 相关行
systemctl cat superd | grep -i "SUPER_ROOT"

# 查看正在运行中的 superd 实际加载的环境变量
systemctl show superd -p Environment

# 查看进程实际读取的当前环境(最旧的 superd 进程)
cat /proc/$(pgrep -o superd)/environ | tr '\0' '\n' | grep SUPER_ROOT

与 Supervisor / systemd 的取舍

与 Python Supervisor 相比,Super 免去了 Python 运行时依赖,且原生提供 REST API、WebSocket 日志流、SQLite 事件历史与 OTA 更新;与 systemd 相比,它绕开了"动态增删服务需编写单元文件"的门槛,跨 Linux/macOS/FreeBSD 一致,并通过 import supervisor 降低迁移成本。对于已经深度使用 systemd 的主机,仅托管少数常驻进程的场景仍可直接使用 systemd;Super 更适合边缘设备、小规格 VPS 与需要编程接口管控进程的场合。该项目目前处于公测阶段,官方建议先在开发或 Staging 环境验证后再上生产。

参考

参考

  1. https://github.com/schiplat/super
  2. https://super.docs.sconts.com/docs/
  3. https://github.com/ruanyf/weekly/issues/11548