systemd 服务起不来?先按这四步排查,再看日志
早上收到告警:某个服务没有随开机正常运行,手动启动又立刻退出。这时不要反复重启,先把失败现场固定下来,再按固定顺序排查。
第一步,看服务状态。执行 systemctl status xxx.service,先看 Active 是 failed 还是 inactive,再看最近输出有没有 ExecStart 报错、退出码、权限不足或找不到文件。两者含义不同:inactive 可能根本没被拉起,failed 则是尝试启动后失败。同时用 systemctl is-enabled xxx.service 确认是否真的设置了开机自启。
第二步,看日志,并收窄时间范围。用 journalctl -u xxx.service --since "1 hour ago" 看最近一小时日志,再用 -xe 看带解释信息的尾部。如果服务反复重启,先定位第一次失败的时间点,再向后追踪,关键信息通常是启动命令报错、配置文件解析失败、依赖未就绪、端口被占用或资源不足。先记下第一次报错,不要被后续连锁报错带偏。
第三步,校验单元文件和启动环境。用 systemd-analyze verify xxx.service 检查语法,再逐项核对:ExecStart 是否为绝对路径、程序是否存在且可执行、WorkingDirectory 是否存在、User 是否有读写配置和日志目录的权限、EnvironmentFile 是否存在、变量是否拼错。一个常见坑是终端能跑通、systemd 却失败,多半是环境变量、当前目录或 PATH 不一致,改写为绝对路径后复现一次即可确认。
第四步,查依赖、端口和资源。After、Wants、Requires 决定启动顺序,依赖没起来或网络未就绪都会让服务提前失败。用 ss -tlnp 查端口占用,确认是否为旧进程未退出或两个服务抢同一端口。再看磁盘剩余空间、日志目录是否写满、内存是否紧张,这些都可能让服务刚启动就失败。
按这张清单走一遍:状态、第一次报错、单元校验、手动复现、依赖与端口、磁盘与内存,大多数启动问题都能在十几分钟内定位到具体一环。
- 点赞
- 收藏
- 关注作者
评论(0)