功能特性
进程托管
- 一个
bm2.toml配置一个项目:单个应用,一个或多个独立实例,上限 1024。 - 命令面:
start、stop、remove、clean、kill、list、check、reload、notify、upgrade、version。 stop停下但留在册,start可恢复;remove退役并交还名字,日志默认保留,-f连状态目录一起清;clean扫掉已经无主的历史目录。kill只管守护进程本身:无参时拒绝执行,加-y才杀掉全部应用并退出。- 优雅停止:SIGTERM 宽限期后 SIGKILL。每次
start对其项目执行一次完整重启,所以改任何字段都在下一次 start 时生效。
监督与自愈
- 崩溃自动重启:异常退出按
restart_delay_ms延迟重启,spawn 失败按次数递增退避。 - 崩溃预算
max_restarts:连续异常重启超过预算即进入errored,停止自愈等待人工介入,而不是无限重试。 - 干净退出(超过
min_uptime_ms的 code 0)不消耗崩溃预算。 - 内存上限
max_memory_mb:超限按异常重启处理。
集群与负载均衡
- cluster 模式基于
SO_REUSEPORT:所有实例共享一个端口,内核分发,无中间层、无单点。 - fork 模式使用连续端口,交给 Nginx、Caddy 之类的网关分发。
- 启动后实测 reusePort 是否真的生效,缺失即停止整个项目并明确报错,而不是让第二个实例随机崩溃。
可靠性与状态
- pidfd 进程跟踪:守护进程崩溃后,新守护进程原地收养仍在运行的应用,应用无感继续运行。
- 状态持久化:掉电或崩溃后实例状态既不丢也不残缺(原子写 + fsync)。
- 本机 TCP + 共享令牌的控制通道,令牌常量时间比较,状态目录 0700。
- CLI 与守护进程互相校验协议版本,版本不一致直接指路
bm2 reload。
日志
- 应用 stdout、stderr 与崩溃诊断三路分离,与 bm2 自身的管理日志严格分开。
- 按大小轮转,
[logs]可按项目配置,默认 10 MB,代数不限。 - 事件日志是 JSONL,只记管理元数据,不含环境变量值与协议载荷。
通知与上报
- 七平台预设:飞书、钉钉、企业微信、Slack、Discord、webhook、邮件。
- 按项目独立配置,覆盖崩溃、预算耗尽、内存超限、reusePort 缺失、生命周期、阈值告警与定期体检。
- 去重、限流、队列、退避重试内置,凭据零泄露。
- 投递是独立任务,端点慢或挂都不占用监督心跳。
自升级
bm2 upgrade比对版本、下载并校验新二进制,然后换入新守护进程,应用继续运行。
它不管理什么
Nginx、域名、证书、热重载、开机自启与远程管理都不在 bm2 的范围内。它是一个进程管理器,不是运维平台。