服务器隔一段时间就自己重启一次,是让人很头疼的一类故障。更麻烦的是,如果重启发生在半夜或者业务高峰期,往往只能第二天看到"系统刚刚启动"的状态,谁也不知道重启前发生了什么。有人第一反应是"肯定是机器老了、硬件坏了",也有人觉得"重启一下就好了",但频繁重启背后可能是软件配置问题(比如误配了 watchdog、systemd 服务反复崩溃触发重启),也可能是实打实的硬件故障(内存 ECC 报错、CPU 过热、电源不稳、磁盘坏道)。方向搞错,换硬件换不掉问题,或者一直靠重启掩盖真正的隐患。
这篇文章给出一套排查频繁重启的方法:先确认"到底重启了几次、什么时候重启的",再区分是"软件主动触发"还是"硬件异常掉电",然后沿着日志、内核消息、硬件日志三条线往下挖。读完你应该能从一张 last reboot 列表开始,逐步定位到具体原因,并知道哪些情况必须停机检修、哪些可以配置层面解决。
一个前提认知:Linux 自己不会无缘无故重启。服务器重启无非三种原因——人为操作(含运维脚本、云平台维护)、软件触发的自动重启(systemd 重启策略、watchdog、panicking 后的自动重启)、硬件或断电导致的重启(掉电、过热保护、内存/CPU 致命错误)。排查的核心就是在这三类里做排除。
一、先确认重启的时间线和频率
排查的第一步不是猜原因,而是把"重启史"拉出来看。时间分布本身就能透露很多信息:如果每天固定时段重启,多半是某个定时任务或监控脚本干的;如果毫无规律,更偏向硬件;如果重启间隔越来越短,可能是过热或电源老化在恶化。
# 查看重启记录(reboot 列表,含时间和时长)
last reboot | head -20
last -x reboot | head -30
# who -b 看最近一次启动时间
who -b
uptime # 第一列就是当前运行时长
# 更精确的启动时间与原因(systemd 系统)
systemctl list-jobs
journalctl --list-boots | tail -20 # 列出所有可查的启动会话,带编号和时间范围
journalctl --list-boots 的输出很有价值:每一行代表一次开机,编号 0 是当前这次,负数表示历史。如果频繁重启,这里会看到一长串密集的记录。记住这些编号,后面用 journalctl -b -1(上一次启动)、-b -2(再上一次)去看当时发生了什么。
# 看上一次启动(崩溃前那次)的日志,重点看结尾
journalctl -b -1 --no-pager | tail -100
# 只看错误级别以上的
journalctl -b -1 -p err --no-pager
# 按时间范围看
journalctl --since "2026-01-10 01:00" --until "2026-01-10 03:00" -p warning
二、系统日志:RHEL 系和 Debian 系的分工
不同发行版的日志文件位置不同,排查前先搞清楚该看哪个文件。
| 系统 | 传统日志文件 | 说明 |
|---|---|---|
| RHEL/CentOS/Rocky | /var/log/messages |
通用系统消息、内核消息汇总 |
| RHEL/CentOS/Rocky | /var/log/secure |
登录、认证相关 |
| Debian/Ubuntu | /var/log/syslog |
通用系统消息 |
| Debian/Ubuntu | /var/log/auth.log |
登录、认证相关 |
| 通用 | /var/log/kern.log |
内核消息(部分发行版单独存) |
| 现代 systemd | journalctl |
二进制日志,统一入口 |
# RHEL/CentOS/Rocky
grep -iE 'error|fail|panic|oops|segfault' /var/log/messages | tail -50
grep -iE 'error|fail' /var/log/secure | tail -30
# Debian/Ubuntu
grep -iE 'error|fail|panic|oops|segfault' /var/log/syslog | tail -50
grep -iE 'error|fail' /var/log/auth.log | tail -30
# 通用:journalctl 里搜关键字
journalctl -p err -b -1 --no-pager | grep -iE 'panic|oops|oom|watchdog'
如果日志文件正在被写入、你又想边看边等下一次重启,用 tail -f。不过要注意,重启前最后几秒的日志往往来不及落盘,这时 journalctl -b -1 里的持久化日志(需开启 /var/log/journal 持久化)会比文件日志更完整。
三、区分三类重启原因
软件触发的自动重启
这类重启的典型特征是:日志里有明确的服务崩溃记录、systemd 的重启计数、或者 watchdog 的触发信息。
# 看 systemd 服务的重启策略与重启次数(Restart= 和 NRestarts)
systemctl show nginx -p Restart -p NRestarts -p ExecMainStartTimestamp
systemctl status nginx | grep -i restart
# 看是否有服务被判定为失败并反复拉起
systemctl --failed
journalctl -u nginx -b -1 --no-pager | tail -50
# 看是否有内核 panic 后的自动重启(panic 参数)
cat /proc/cmdline # 是否有 panic=10 之类
sysctl kernel.panic kernel.panic_on_oops
kernel.panic 如果不为 0,表示内核 panic 后 N 秒自动重启。这在无人值守的机房很常见,但它会掩盖问题——你以为机器"只是重启了一下",其实是被 panic 重启了。所以一定要去 -b -1 的日志里找 panic 痕迹。
硬件/断电导致的重启
这类重启的特征是:日志戛然而止,没有任何关机序列,重启后 last reboot 显示一次非正常的启动。内核里如果有 panic、oops、Machine Check Exception (MCE)、BUG: soft lockup 等字样,基本可以判定是硬件或内核级故障。
# 看内核环形缓冲区里的关键错误
dmesg -T | grep -iE 'panic|oops|mce|hardware error|machine check|thermal|watchdog|BUG'
# 看上一次启动的内核消息
journalctl -k -b -1 --no-pager | grep -iE 'error|fail|mce|panic'
# 看机器硬件错误表(如果开了 EDAC/MCE 记录)
cat /var/log/mcelog 2>/dev/null | tail -50 # 需安装 mcelog
dmesg -T | grep -i -E 'edac|correctable|uncorrectable'
人为操作
别忘了最简单的一种:有人(或脚本)执行了 reboot。查 last 和相关审计日志:
last -x | grep -E 'reboot|shutdown' | head -20
grep -i 'reboot\|shutdown' /var/log/secure 2>/dev/null | tail
# 有 auditd 的话
ausearch -m system_boot -ts recent 2>/dev/null | tail
如果发现是计划任务干的,检查 crontab:crontab -l、ls /etc/cron.*/。
四、硬件层面的深挖
排除了软件问题,就要认真看硬件。按出问题概率排序,服务器重启的硬件原因大致是:内存 > 电源 > 温度/散热 > CPU > 主板/磁盘。
内存故障(ECC 报错)
服务器内存一般带 ECC(纠错码)。可纠正错误会记录但不致命,不可纠正错误(UE)会导致内核 panic。查内存错误:
# 需要 edac-utils
sudo yum install -y edac-utils # RHEL/CentOS/Rocky
sudo apt install -y edac-utils # Debian/Ubuntu
edac-util -v
edac-util --report=full
# 看 dmesg 中的内存错误
dmesg -T | grep -i -E 'edac|memory error|correctable|uncorrectable'
# mcelog 服务/工具(x86 平台)
sudo yum install -y mcelog
systemctl status mcelog
mcelog --client 2>/dev/null || cat /var/log/mcelog
温度与散热
CPU 或主板过热会触发保护性关机。查温度:
# lm-sensors:需先探测后用
sudo yum install -y lm-sensors # RHEL 系
sudo apt install -y lm-sensors # Debian 系
yes | sudo sensors-detect # 首次使用探测
sensors -A
sensors | grep -iE 'Core|Package|temp'
# 看内核层面的过热记录
dmesg -T | grep -i -E 'thermal|temperature|critical'
journalctl -b -1 -k --no-pager | grep -i thermal
经验值:CPU 长期高于 80℃ 就要关注,接近 90℃ 有降频乃至关机风险;机房进风温度一般维持在 18–27℃。如果 sensors 显示温度异常高,先查风扇转速和机箱积灰,再看散热硅脂和风道。
电源问题
电源(PSU)故障或市电不稳会导致无征兆掉电重启。这类问题日志里往往什么都不留。可以看:
# IPMI/BMC 里通常有电源事件日志(需带外管理)
# 各厂商工具不同,通用的可以看内核日志里 PSU 相关
dmesg -T | grep -iE 'power|psu|acpi'
journalctl -k -b -1 --no-pager | grep -iE 'power|acpi|battery'
带外管理(iDRAC、iLO、IPMI)里的硬件事件日志(SEL, System Event Log)是查电源、温度、风扇问题的金矿。建议所有物理服务器都开启并定期巡检。
磁盘坏道
磁盘严重坏道也可能导致系统卡死继而重启(尤其是系统盘)。查 SMART:
sudo yum install -y smartmontools
sudo smartctl -a /dev/sda | grep -iE 'health|reallocated|pending|uncorrectable'
sudo smartctl -H /dev/sda # 健康状态概览
# 查看正在进行的自检结果
sudo smartctl -l selftest /dev/sda
关注 Reallocated_Sector_Ct、Current_Pending_Sector、Offline_Uncorrectable 三项是否在增长,增长说明盘在劣化,应尽快换盘。
五、三类原因与对应处理
| 现象特征 | 大概率原因 | 处理方式 |
|---|---|---|
| 日志有服务崩溃、Restart 计数在涨 | systemd 重启策略/服务反复崩 | 修服务本身,调整 Restart= 策略 |
| 日志戛然而止、重启后 dmesg 有 panic/MCE | 硬件(内存/CPU)或内核 bug | 先修内存、换内核版本、开 kdump |
| 温度触发、日志有 thermal | 散热/风扇/积灰 | 清灰、换风扇、检查风道 |
| 无任何日志、频繁无征兆掉电 | 电源/市电 | 查 IPMI 事件日志、换电源、加 UPS |
| 固定时间点重启 | 定时任务/监控脚本 | 查 crontab、运维平台 |
| 磁盘 SMART 报警 | 磁盘劣化 | 备份数据、更换磁盘 |
六、防患于未然
排查完当前问题后,要做几件事避免下次再来:
- 开启持久化日志:默认 journald 可能是内存存储,重启就丢。创建
/var/log/journal目录并重启 journald,日志才能跨重启保留。
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald
# 确认持久化已生效(Storage=persistent)
grep -iE '^Storage' /etc/systemd/journald.conf
- 配置 kdump:内核崩溃时自动收集 vmcore,是分析 panic 的关键(详见第五篇)。
sudo yum install -y kexec-tools
systemctl enable --now kdump
systemctl status kdump
cat /proc/cmdline | grep crashkernel # 确认预留了 crashkernel 内存
- 开启硬件监控:用 IPMI 带外管理定期巡检硬件事件日志,用监控系统采集温度、风扇、ECC 计数、SMART 指标并设置告警。
- 定期巡检:物理服务器建议每季度做一次 IPMI SEL 检查、SMART 检查、日志轮转检查。
常见问题
Q:last reboot 显示一堆记录,但没人重启过,怎么回事?
要么是硬件/软件触发的自动重启,要么是 last 的日志被覆盖或错乱。结合 journalctl --list-boots 和 -b -1 的日志判断每次重启前发生了什么。若日志里什么都没留,优先怀疑掉电或硬件。
Q:怎么判断是内存问题还是内核 bug?
看 dmesg / mcelog:如果有 MCE(Machine Check Exception)、EDAC 不可纠正错误,基本是内存硬件问题;如果只有 panic/oops 且没有 MCE,更可能是内核或驱动 bug,可以尝试升级或回退内核验证。
Q:服务器重启后业务服务没自动起来,是重启的问题吗?
不是。这是服务没有配置开机自启。systemctl enable 服务名 即可。重启故障排查完,顺手检查一遍关键服务是否都 enabled。
Q:虚拟机频繁重启和物理机排查一样吗?
不一样。虚拟机要先怀疑宿主机资源争抢、宿主机迁移、hypervisor 层面的事件。看宿主机日志和虚拟化平台的事件记录,再往虚机内部查。
Q:云端服务器频繁重启怎么查?
优先看云平台的系统事件日志和宿主机维护记录(部分重启是平台迁移、宿主机故障导致)。云控制台通常有"实例事件"记录,能看到是否为平台侧触发。
总结
排查 Linux 频繁重启,先拉时间线:last reboot、who -b、journalctl --list-boots,看重启的频率和分布,从规律性判断是人为、软件还是硬件。
再用 journalctl -b -1 -p err、/var/log/messages(RHEL 系)//var/log/syslog(Debian 系)、dmesg -T 三类日志找证据,重点搜 panic、oops、MCE、thermal、oom、watchdog 关键字。
硬件方向按内存(EDAC/mcelog)、温度(lm-sensors)、电源(IPMI 事件日志)、磁盘(smartctl)顺序排查;软件方向看 systemd Restart= 策略、kernel.panic 参数、crontab。
排查完成后务必开启 journald 持久化和 kdump,前者能保住崩溃前日志,后者能在 panic 时留存 vmcore,这两项是后续定位的根基。
企业QQ咨询




