fix(install): 刚装完的服务会失败,单元要说清楚而不是每 5 秒重启一次
我在真内核上把安装序列完整走了一遍(容器里补了 useradd/systemctl 的替身,其余全是真的), 暴露出一个只有真跑才看得见的缺陷: 装完 → `install` 启动服务 → 但那时**还没有配对的手机**,而守护进程**故意**拒绝空的设备列表 (一个什么都不能授权的 agent 不该坐在那里显得健康)。于是 `Restart=always` + `RestartSec=5` 变成每 5 秒重启一次,永远,journal 里刷同一行。实测:exit 1,"devices is empty, so no phone could ever be authorised"。 配对发生在安装**之后**(运维在节点上跑 `--pair`,然后在手机上配对),所以这不是异常状态, 而是流程的必经一步。修法两条: - 单元加 `StartLimitIntervalSec=300` / `StartLimitBurst=10`:十次之后 systemd 放弃,单元进入 `failed`——一个运维看得见、能处理的状态,而不是无限重启。 - `install` 的结束语改成说清这一步:服务会退出并停住,下一步是 `--pair`,用 `systemctl status` 看状态。此前它说"installed and running",而那是假的。 同一轮演练确认了此前所有修复在真内核上成立:服务用户建了、配置与日志目录交给它了、配置对 该用户可读、单元来自二进制且内容一致、卸载按序拆干净(用户/目录/单元全无残留)。 Go 全包通过(新增一项守着"单元必须有启动上限,且 install 必须说出下一步")。
This commit is contained in:
@@ -141,9 +141,13 @@ func Install(opts InstallOptions) error {
|
||||
opts.Log("dry run: nothing was changed")
|
||||
return nil
|
||||
}
|
||||
opts.Log("msa-agent installed and running")
|
||||
opts.Log("check it with: journalctl -u %s -n 20", paths.ServiceName)
|
||||
opts.Log("next: run `msa-agent --pair` once, then pair the phone from the app")
|
||||
// The service will fail until a phone is paired, and that is expected rather than a fault: the daemon
|
||||
// refuses an empty device list so it cannot sit there looking healthy while authorising nothing. The
|
||||
// unit's start limit turns that into a `failed` state instead of a restart loop, and this line is
|
||||
// what makes the state expected.
|
||||
opts.Log("msa-agent installed and enabled")
|
||||
opts.Log("next: run `msa-agent --pair` once and pair the phone; until then the service exits and stops")
|
||||
opts.Log("check it with: systemctl status %s; journalctl -u %s -n 20", paths.ServiceName, paths.ServiceName)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user