华为云ECS上用 journalctl 排查 systemd 服务启动失败
在华为云弹性云服务器上,自己写的服务或常用组件有时会在开机后起不来。systemctl 只提示 failed,真正原因往往在日志里。下面用 journalctl 把启动失败拆开看,不依赖图形界面。
先确认服务状态
在终端执行:
systemctl status 你的服务名
重点看三处:Active 是不是 failed,主进程有没有退出码,以及最下面几行简短报错。如果这里信息不够,再查完整日志。
用 journalctl 看完整记录
查看某个服务从本次启动以来的日志:
journalctl -u 你的服务名 -b --no-pager
只看错误级别:
journalctl -u 你的服务名 -p err -b --no-pager
持续跟踪:
journalctl -u 你的服务名 -f
时间范围也能收窄,例如最近一小时:
journalctl -u 你的服务名 --since “1 hour ago” --no-pager
常见失败原因
第一,单元文件路径或工作目录写错,日志里会出现 No such file or directory。核对 ExecStart、WorkingDirectory 是否真实存在,文件有没有可执行权限。
第二,端口被占用。日志可能提到 address already in use。用 ss -lntp 看是哪个进程占用了同一端口,避免两个服务抢同一个监听地址。
第三,权限不足。以普通用户运行的服务去写只有管理员能写的目录,会看到 Permission denied。把数据目录属主改成服务运行用户,或在单元文件里明确 User 和 Group。
第四,环境变量缺失。依赖配置文件路径、密钥文件或自定义环境变量时,忘记在单元文件的 Environment 或 EnvironmentFile 里声明,进程会立刻退出。把 systemctl show 你的服务名 里的环境相关字段和日志对照即可。
第五,依赖顺序不对。服务需要数据库或网络就绪却过早启动,可能先失败再被自动拉起。可以在单元文件里用 After 和 Requires 声明依赖,再用 systemctl daemon-reload 后重启。
改完如何验证
修改单元文件后必须执行:
systemctl daemon-reload
systemctl restart 你的服务名
systemctl is-active 你的服务名
再用 journalctl -u 你的服务名 -n 50 --no-pager 看最近五十行,确认没有新的报错。如果服务设置了 Restart 策略,失败后会反复拉起,日志会刷得很密,这时先停掉服务再查,避免被滚动日志淹没。
小结
排查启动失败时,先看 systemctl status 的退出码和摘要,再用 journalctl 按服务名、优先级和时间过滤。把路径、端口、权限、环境和依赖五项逐一对照,大多数问题能在云服务器的命令行里定位,不必先重装系统或重建实例。
- 点赞
- 收藏
- 关注作者
评论(0)