用 journalctl 快速定位服务启动失败

举报
yd_214683010 发表于 2026/11/07 06:08:47 2026/11/07
【摘要】 服务起不来,先别急着重装,更别急着重启整台机器。systemd 会把服务的标准输出、标准错误和退出信息都记进 journal,journalctl 就是顺着这条线找原因最快的工具。一、先看最近的日志journalctl -u nginx.service --since “10 minutes ago”只看最近 10 分钟,避免被旧日志淹没。也可以看最后 100 行:journalctl -u...

服务起不来,先别急着重装,更别急着重启整台机器。systemd 会把服务的标准输出、标准错误和退出信息都记进 journal,journalctl 就是顺着这条线找原因最快的工具。

一、先看最近的日志

journalctl -u nginx.service --since “10 minutes ago”

只看最近 10 分钟,避免被旧日志淹没。也可以看最后 100 行:

journalctl -u nginx.service -n 100 --no-pager

–no-pager 可以防止进入 less 分页,适合在排障时直接输出。

二、按优先级过滤

journalctl -u myapp.service -p err --since today

只看 err 及以上级别。先看错误再看警告:很多启动失败的根因,就藏在 “Failed to start” 上面几行,比如端口被占用、配置文件语法错误、依赖文件不存在。

三、看完整的失败过程

journalctl -u myapp.service -b

只看本次启动以来的日志,排除上一次启动的干扰。再配合 systemctl status 看退出码:退出码 1 常是程序自身报错,203 常是 ExecStart 路径或权限问题,127 常是命令找不到。

四、一个实战例子

某次 nginx 启动失败,systemctl status 只显示 failed。用 journalctl -u nginx -n 50 查到 “bind() to 0.0.0.0:80 failed (98: Address already in use)”,再用 ss -tlnp | grep :80 找到占用 80 端口的旧进程,结束它之后服务一次启动成功。没有 journalctl,这一步只能靠猜。

五、两个容易踩的坑

第一,日志可能被轮转或清理。journald 默认按磁盘配额保留日志,查不到旧日志时,先看 /var/log/messages 或应用自己的日志文件。

第二,时间可能不对。服务器时区或时钟不同步,会让 --since 框错时间段,查之前先用 date 和 timedatectl 确认时间。

结语:服务启动失败,先执行 journalctl -u 服务名 -p err --since today,再结合 systemctl status 看退出码,大多数问题五分钟内就能定位到具体原因。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。