首页 > Sysadmin > 正文

Linux 软件启动失败排查指南

huyuanwen 2026-11-04 Sysadmin

服务起不来时,先看状态、再查日志,最后修配置。systemd 是 Ubuntu 24.04 / Debian 12 的默认 init,排查顺序官方文档有明确推荐[1]。

先看服务状态

systemctl status <服务名>

关键看 Active: 字段。如果是 failed,记下退出码;如果是 inactive (dead),说明没启动成功或被停掉。用 failed 状态列全部失败单元,避免逐个翻[1]:

systemctl list-units --failed

查 journal 日志

journalctl -u <服务名> -n 50 --no-pager

-u 限定单元,-n 50 只看最近 50 行。如果是刚启动失败,加 -b 只读本次启动日志,减少噪音[2]。

检查 unit 配置

最常见的三种问题:ExecStart= 路径写错、Type= 与实际进程模型不符、权限用户不存在。先确认 unit 文件是否真的被加载:

systemctl cat <服务名>

然后对照官方 Type= 说明:simple 在 fork 后即认为已启动;如果进程会 fork 到后台,应使用 forking,否则 systemd 可能误判[1][3]。ExecStart= 必须是绝对路径,否则 unit 加载会报错[4]。

回滚与修复

改 unit 文件前先备份,改完重载并重启;失败后可重置状态:

cp /etc/systemd/system/<服务名>.service /root/<服务名>.service.bak
systemctl daemon-reload
systemctl restart <服务名>
systemctl reset-failed <服务名>

排错速查

现象 原因 处理
Active: failed,status=203/EXEC ExecStart 路径不存在 which 确认二进制路径
Active: failed,status=226/NAMESPACE User= 不存在 检查 /etc/passwd
Active: inactive (dead) 没设置 WantedBy 补 systemctl enable
日志里有 Permission denied SELinux/AppArmor 或文件权限 查看 aa-status 或 audit.log
code=exited, status=1/FAILURE 程序自身异常退出 单独跑 ExecStart 命令复现

实测与局限性

  • 实测环境:WSL2 Ubuntu 24.04,systemd 255.4。
  • 已验证:systemctl status/list-units --failed/journalctl -u/journalctl -b/daemon-reload/reset-failed。
  • 局限性:WSL2 的 systemd 是用户态模拟,完整 systemd 行为(如真正的 cgroup 隔离)与物理机/云服务器不同;journal 在容器环境(Docker/Kubernetes)中可能被 stdout 驱动,不经过 systemd-journald。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。