服务起不来别急着重装:用 journalctl 三步定位问题

举报
yd_213100591 发表于 2026/11/11 16:33:05 2026/11/11
【摘要】 服务器上的服务突然起不来,很多人第一反应是重启机器,或者干脆重装。重启有时能蒙对,但问题本身还在,下次还会出现。systemd 的服务每次启动失败都会留下记录,journalctl 就是查这份记录的工具,用熟三步,大多数启动失败都能在几分钟内定位。第一步,先看服务自己的状态。systemctl status nginx 这类命令会显示服务是 active 还是 failed,以及最后几行日志...

服务器上的服务突然起不来,很多人第一反应是重启机器,或者干脆重装。重启有时能蒙对,但问题本身还在,下次还会出现。systemd 的服务每次启动失败都会留下记录,journalctl 就是查这份记录的工具,用熟三步,大多数启动失败都能在几分钟内定位。

第一步,先看服务自己的状态。systemctl status nginx 这类命令会显示服务是 active 还是 failed,以及最后几行日志。failed 后面常跟一句 exit code,比如 code=exited, status=1/FAILURE,这只能告诉你它退出了,原因还得往下挖。注意看 Main PID 和 Loaded 那几行:Loaded 告诉你实际加载的是哪个 unit 文件,改配置改错文件是新手最常见的坑——改了 /etc/nginx/nginx.conf,服务读的却是另一个路径的配置。

第二步,用 journalctl 按服务过滤。journalctl -u nginx --since "10 minutes ago" 只看这个服务最近 10 分钟的日志,比翻整个系统日志快得多。加上 -n 100 是看最后 100 行,-f 是实时跟随,服务正在反复重启时用 -f 能直接看到它每次失败的瞬间。如果想看某一次启动的完整过程,可以先 systemctl restart nginx,再立刻跑这条命令,日志就是干净的一次启动记录。

第三步,读错误本身,而不是猜。几种常见报错一眼就能认出来:bind() to 0.0.0.0:80 failed (98: Address already in use) 是端口被占了,先 ss -tlnp | grep :80 看看谁占着,再决定是停掉旧进程还是改端口;failed to load certificate 或 cannot load certificate 是证书路径错了或者文件权限不对,证书文件一般要让运行服务的用户能读;Permission denied 出现在日志文件、数据目录上时,先看目录属主是不是服务用户,而不是直接 chmod 777——777 能解决问题,也会把问题放大。配置语法错误最省事:Nginx 有 nginx -t,很多服务都有自己的 --test 或 configtest,改完配置先测再重启,失败也知道错在哪一行。

还有一个容易被忽略的点:磁盘满了服务也可能写不进日志,看起来像“没有任何报错”,其实是没地方写了,journalctl --disk-usage 能先看一眼日志占了多少空间。

养成习惯:服务出问题,先 systemctl status,再 journalctl -u <服务名> --since,最后读报错原文。大部分时候答案已经写在日志里了,只是之前没去看。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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