用 journalctl 快速定位服务故障:从报错时间倒推问题

举报
yd_236639601 发表于 2026/11/01 10:11:33 2026/11/01
【摘要】 服务挂了、接口 500 了,先别急着重启碰运气。systemd 的日志都在 journalctl 里,按时间倒推,往往几条命令就能锁定是配置错了、依赖没起来,还是资源被耗尽了。 一、先看最近的报错,别从头翻日志journalctl -u nginx -n 100 --no-pagerjournalctl -u nginx -p err -n 50 --no-pager-u 指定服务,-n 只...

服务挂了、接口 500 了,先别急着重启碰运气。systemd 的日志都在 journalctl 里,按时间倒推,往往几条命令就能锁定是配置错了、依赖没起来,还是资源被耗尽了。

一、先看最近的报错,别从头翻日志

journalctl -u nginx -n 100 --no-pager
journalctl -u nginx -p err -n 50 --no-pager

-u 指定服务,-n 只看最后若干行,-p err 只看错误及以上级别。服务刚挂掉时,先看最后 100 行,大多数故障的直接原因就在这里:端口被占、配置文件语法错、依赖的数据库连不上,报错原文通常写得很直白。

如果不知道故障发生在几点,先看服务状态里的时间戳,再按时间段查:

journalctl -u nginx --since "2026-11-01 09:00" --until "2026-11-01 09:30" --no-pager

时间范围一收窄,无关日志立刻消失,比全文搜索省事得多。

二、从启动失败倒推:看上一次启动的全过程

服务起不来时,只看报错行可能不够,要看它启动时走到了哪一步:

journalctl -u myapp --since "today" --no-pager | head -n 100

重点看三类信息:第一,启动命令本身有没有报错,比如可执行文件路径错了、参数拼错了;第二,依赖有没有就绪,比如先于数据库启动、网络还没配好;第三,权限有没有问题,比如读不到证书文件、写不了日志目录。启动日志是按顺序的,卡在哪一步,后面的步骤就不会出现,断点就是线索。

配合状态命令一起看更完整:

systemctl status myapp --no-pager

状态页会给出最近几行日志、退出码和主进程 PID,退出码 203 常是可执行文件或工作目录问题,退出码 1 则要回日志里找应用自己的报错。

三、把日志和系统状态对上号

日志里说连接超时、内存不足,别只信一句话,用系统状态交叉验证:

journalctl -p err --since "1 hour ago" --no-pager
free -h
ss -tlnp | grep 8080

内存耗尽时日志里会出现 OOM 相关记录,同时 free 能看到内存见底;端口冲突时日志报地址已被使用,ss 能直接看到占用者。两个来源对得上,结论才站得住;对不上,就说明报错可能是表象,真正的原因还在上游。

还有一个容易忽略的点:日志时间。journalctl 默认按本地时区显示,查跨时区部署的服务时,先确认 timedatectl 的时区设置,否则按北京时间去对 UTC 日志,时间段会错位一整段。

四、一套固定的排查顺序

服务异常:先 systemctl status 看状态和退出码 → 再 journalctl -u 服务 -n 100 看最近报错 → 按报错时间用 --since/--until 收窄 → 看上一次完整启动日志找断点 → 用 free、ss、磁盘使用率交叉验证。按这个顺序走,大多数服务故障不用重启三次就能定位,不用来回猜。

小结

journalctl 的价值不在日志多,而在能按服务、级别、时间三把筛子快速收窄。先看最近报错,再看启动断点,最后和系统状态对上号——定位先于动手,重启只是确认修复的最后一步,不是排查本身。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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