这类问题我又碰上了一次。CentOS 7 上自写 unit,systemctl enable app 输出 Created symlink /etc/systemd/system/multi-user.target.wants/app.service,重启后服务没起,可 is-enabled 明明还是 enabled。
把日志和配置对完,能解释这个现象的基本就这几处。[Install] 里写的是 WantedBy=default.target,机器默认目标不是它,链接建了也不会被拉起;unit 里 ConditionPathExists 指向的目录不存在,启动时被静默跳过;真正启动的 unit 名与链接名不一致,模板 @.service 的实例没对上。
上来先看安装目标与条件
systemctl show app -p WantedBy,RequiredBy
随后检查符号链接落在哪个目录
ls -l /etc/systemd/system/*.target.wants/ | grep app
接着重新按正确目标 enable
systemctl disable app && systemctl enable app
剩下的就是重启前先验证一次
systemctl start app && systemctl is-active app
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
白天有业务在跑,能验证的部分都压到了晚上做。
当时还开着另一个排查窗口,两边日志对照着看才定位到。
恢复的判定其实很直接。重启后 systemctl is-active app 为 active,journalctl -b 里能看到本次启动的 Starting 与 Started,is-enabled 仍是 enabled。
这里还有个坑。enable 只负责建链接,能不能被拉起取决于 WantedBy 与默认目标;Condition 类指令不满足时不会报错,只会在 status 里显示条件失败。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
