0

0

Linux 服务异常重启的排查思路

冷炫風刃

冷炫風刃

发布时间:2026-01-24 12:55:36

|

597人浏览过

|

来源于php中文网

原创

服务进程突然消失应先查 systemd 日志:用 journalctl -u .service -n 100 --no-pager 查近期日志,加 -o cat 去噪;识别段错误(SEGV)、OOM Killer(status=137)、超时(timeout)等关键线索;再通过 dmesg、OOM 相关文件、Restart 策略、依赖服务及资源状态逐层排查根本原因。

linux 服务异常重启的排查思路

服务进程突然消失,先查 systemd 日志

systemd 是现代 Linux 发行版的默认 init 系统,服务异常退出后,systemctl status 只显示当前状态,真正线索藏在 journal 中。journalctl -u .service -n 100 --no-pager 能快速拉出最近 100 行日志;若服务已崩溃,加 -o cat 去掉时间戳和优先级前缀,让错误更醒目。

常见干扰项:日志里出现 main process exited, code=killed, signal=SEGV 表示被段错误终止;code=exited, status=137 往往是 OOM Killer 杀掉的(注意不是服务自己退出);Failed with result 'timeout' 则说明启动超时,可能卡在初始化阶段。

确认是否被 OOM Killer 终止

OOM Killer 在内存不足时会按 oom_score_adj 选中进程 kill,不写日志到服务 unit 日志里,只记在内核环缓冲区。运行 dmesg -T | grep -i "killed process",如果看到类似 Killed process 12345 (python3) total-vm:2.1g, anon-rss:1.8g, file-rss:0k,基本就是它干的。

验证方式:

  • 检查 /proc//oom_score_adj(若进程还在)或历史 systemctl show --property=OOMScoreAdjust
  • systemctl show .service | grep MemoryLimit,没设 MemoryMax 的服务更容易被盯上
  • cat /sys/fs/cgroup/memory/system.slice/.service/memory.oom_control 如果存在且值为 0,说明该 cgroup 曾触发 OOM

检查服务配置中的 Restart 策略是否掩盖问题

很多服务 unit 文件里写了 Restart=alwaysRestart=on-failure,导致进程“刚挂就拉”,掩盖了真实失败原因。这种情况下,systemctl status 显示 “active (running)” 是假象——它只是刚被拉起来而已。

ReRoom AI
ReRoom AI

专为室内设计打造的AI渲染工具,可以将模型图、平面图、草图、照片转换为高质量设计效果图。

下载

排查要点:

  • 运行 systemctl show .service | grep -E "(Restart|StartLimit)" 查重启策略和限制
  • StartLimitIntervalSecStartLimitBurst 控制单位时间内最多重启几次;超过后会进 failed 状态并锁住,这时才容易暴露原始错误
  • 临时禁用自动重启systemctl stop .service && systemctl reset-failed .service && systemctl start .service,观察首次启动是否失败

依赖服务或资源不可用导致连锁失败

服务本身代码没问题,但依赖的数据库连不上、配置文件被删、socket 文件被清空、SELinux 拒绝访问,都会引发看似“无征兆”的重启。比如 PostgreSQL 服务启不来,依赖它的应用反复尝试连接失败,最终因健康检查超时被 systemd 杀掉再拉起。

关键动作:

  • systemctl list-dependencies --reverse .service 看谁依赖它,再用 --after/--before 查启动顺序
  • 检查 systemctl is-activeis-enabled 对所有 Wants=Requires= 列出的服务
  • 对网络依赖,用 ss -tulpn | grep : 确认端口是否真被监听;对文件依赖,用 strace -e trace=openat,open,connect -p 2>&1 | grep -E "(ENOENT|ECONNREFUSED)" 抓实时系统调用错误

真正棘手的往往是那些没有显式报错、但卡在某一步等超时的场景——比如 DNS 解析失败导致服务初始化阻塞 90 秒,systemd 启动 timeout 默认 90 秒,刚好踩线失败。这类问题不会直接告诉你“DNS 不通”,得从超时点反推。

相关专题

更多
postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

158

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

978

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

197

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

269

2023.11.20

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

356

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2076

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

348

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

255

2023.09.05

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.7万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号