标准答案

  1. 先确认 unit 是否加载了预期文件、ExecStart、WorkingDirectory、User、EnvironmentFile 和监听端口。
  2. 用 systemctl status 和 journalctl 查看退出码、标准错误、依赖失败和重启循环,区分启动即退出与启动后健康检查失败。
  3. 服务启动成功只代表主进程启动命令返回成功,不代表端口、依赖和业务健康。
  4. 重启策略应配合退避、启动超时、停止超时和幂等初始化,避免故障时形成高频重启风暴。

题目解析

systemd 按 unit 文件定义 User、Group、WorkingDirectory、EnvironmentFile、PATH、权限和依赖顺序,通常不会加载用户的 .bashrc。服务在交互式终端能启动,只能证明当前 shell 环境可用,不能证明 systemd 的执行身份、路径和文件权限正确。

排查先看 systemctl status、journalctl -u 和 unit 的最终展开配置,再手动核对 ExecStart、工作目录、监听端口和依赖。Restart=always 只能用于明确的守护进程语义,还要配合 RestartSec、启动失败限流和退出原因监控,避免配置错误造成重启风暴。

常见误区

  • 误区:只执行 restart 不看退出原因。改正:结合 status、journalctl 和 systemd-analyze verify 检查真实失败阶段。
  • 误区:认为 service 会继承交互式 shell 环境。改正:在 unit 中显式设置工作目录、环境文件和 PATH。
  • 误区:所有服务都配置 Restart=always。改正:按退出码和服务语义设置重启策略,并限制重启频率。

作者信息