Ubuntu/Debian系统排查指南:如何用journalctl深挖那些莫名其妙的关机重启事件
Ubuntu/Debian系统异常关机重启深度调查从journalctl日志中揪出“真凶”你有没有遇到过这样的场景服务器在凌晨三点突然重启业务中断而你早上查看监控时一脸茫然或者一台开发机在你离开座位几分钟后自动关机所有未保存的工作付之东流。在Ubuntu或Debian这类Linux系统中这类“幽灵事件”往往让人头疼。很多人第一反应是查看/var/log/syslog或者last reboot但这些命令通常只能告诉你“什么时候发生的”却很难告诉你“究竟是谁干的”以及“为什么发生”。今天我们不谈那些基础命令的皮毛而是深入到系统日志的核心——journalctl来一场真正的“数字取证”。我们将聚焦于如何利用journalctl的强大过滤、关联和分析能力从海量日志中精准定位导致异常关机或重启的进程、用户甚至内核事件。这不仅仅是命令的堆砌而是一套完整的、可复现的排查思维和操作流程专为需要追根溯源的中高级用户设计。1. 理解系统关机的日志脉络不止于一条记录当系统关机或重启时它并非悄无声息。一系列有序的事件会被记录在系统日志中。很多人以为找到一条“systemd-shutdown”或“shutdown”的日志就万事大吉这其实错过了大量关键上下文。一个完整的关机事件其日志链条通常包含以下几个阶段触发信号可能是用户执行的shutdown、reboot命令也可能是某个进程触发了systemctl操作甚至是内核遇到了严重错误Panic/OOM。服务停止systemd会按依赖关系有序地停止所有运行中的服务每个服务的停止状态都会被记录。用户会话结束所有登录用户会被登出相关会话信息被清理。文件系统卸载确保所有数据写入磁盘。电源管理事件最终向硬件发送关机或重启指令。journalctl的优势在于它能以时间线的方式完整呈现这个链条。我们的调查就是要从结果系统关闭反向追溯到这个链条的起点。1.1 定位目标关机事件的时间窗口排查的第一步是确定异常事件发生的精确时间。uptime和last reboot能给出大概时间但对于密集的日志分析我们需要更精确的“锚点”。# 查看系统所有的启动记录获取每次启动的Boot ID和大致时间范围 journalctl --list-boots这条命令会输出一个简洁的列表-2 d4721a7e1b2e4a1a8e5c8f3b1c9a0d12 Mon 2023-10-23 03:14:15 CST—Mon 2023-10-23 08:05:21 CST -1 a1b2c3d4e5f67890123456789abcdef0 Tue 2023-10-24 09:00:01 CST—Tue 2023-10-24 15:30:45 CST 0 f0e1d2c3b4a5968778695a4b3c2d1e0f Wed 2023-10-25 07:15:30 CST—Wed 2023-10-25 17:20:10 CST假设我们怀疑-1那次启动10月24日09:00是异常重启那么这次启动的Boot IDa1b2c3d4e5f67890123456789abcdef0就是关键。这次启动之前的日志就包含了导致重启的原因。注意--list-boots显示的时间是系统启动时间。要调查关机我们需要关注的是上一次运行会话的结束时间即列表中上一行记录的结束时间例如-2的结束时间08:05:21可能就是-1启动前关机的时间点。1.2 聚焦关键时间段的原始日志有了大致的时间范围例如10月24日 08:00 到 09:00我们可以拉取这个时间段的完整日志进行初步筛查。使用--since和--until参数是更高效的做法。# 查看特定时间段的日志时间格式非常灵活 sudo journalctl --since 2023-10-24 08:00:00 --until 2023-10-24 09:00:00如果日志量巨大输出可能会刷屏。一个更聪明的办法是直接查看上一次系统运行会话即-2那次启动的完整日志因为关机事件必然发生在其中。# 查看指定Boot ID这里用-2表示上一次启动的所有日志 sudo journalctl -b -2现在你看到的日志流就是导致本次重启的“案发现场”全记录。2. 深挖关机触发器过滤与关联的艺术面对整段日志我们需要用一系列过滤器像筛子一样逐步缩小嫌疑范围。journalctl的过滤能力是其核心价值所在。2.1 第一层过滤直接搜索关机相关消息最直接的线索当然是包含“shutdown”、“halt”、“poweroff”、“reboot”等关键词的消息。但要注意这些词可能出现在不同服务和不同优先级的日志中。# 在上次启动的日志中搜索所有与关机相关的条目并按时间倒序排列最新的在最前面 sudo journalctl -b -2 --grepshutdown\|halt\|poweroff\|reboot\|System is halting\|Stopping.*target --reverse关键解读点Stopping一系列target或service这是systemd按顺序停止服务的正常流程。如果这个过程在某个服务处卡住很久或者报错可能就是线索。Received SIGTERM如果某个关键进程如数据库、Web服务器的日志显示它收到了终止信号这可能是因为系统关机触发的但也可能是该进程自身崩溃。systemd-logind的消息这个服务管理用户登录和会话。消息如“Power key pressed”或“HandlePowerKey”会直接指出硬件电源键被按下。kernel消息如“Kernel panic”,“Out of memory”等是硬件或内核驱动故障的明确信号。2.2 第二层过滤按进程和用户追踪找到关机时间点附近的日志后下一步是找出“元凶”进程。journalctl可以按进程IDPID、用户UID或单元Unit进行过滤。场景一怀疑是某个特定用户或命令所为假设我们从其他线索如终端历史history怀疑用户alice可能在那个时间点执行了操作。# 查看用户alice的进程在上次运行会话中产生的所有日志 sudo journalctl -b -2 _UID$(id -u alice)场景二锁定发起关机的进程关机命令通常由systemd的相关单元执行。我们可以查看systemd单元日志。# 查看与关机、重启相关的systemd单元日志 sudo journalctl -b -2 _SYSTEMD_UNITsystemd-shutdown.service sudo journalctl -b -2 _SYSTEMD_UNITsystemd-reboot.service # 查看谁调用了关机关注systemd-logind sudo journalctl -b -2 _SYSTEMD_UNITsystemd-logind.service --no-pager | tail -50在systemd-logind的日志中你可能会看到类似下面的关键行Oct 24 08:05:15 hostname systemd-logind[1234]: Power key pressed. Oct 24 08:05:15 hostname systemd-logind[1234]: Operation reboot initiated by user bob (uid1001) on seat seat0 (pid5678 /usr/bin/gnome-terminal).这行日志是“铁证”——它清晰地记录了用户bob在seat0通常是图形界面通过进程PID5678一个终端发起了reboot操作。2.3 第三层分析时间戳与因果关系重建如果上述过滤没有直接找到“人祸”证据如用户执行命令那么“天灾”系统错误的可能性就增大了。此时我们需要在关机时间点之前的几分钟到几十分钟内寻找异常模式。# 查看上次运行会话结束前30分钟内的所有错误ERROR和严重CRIT及以上级别的日志 sudo journalctl -b -2 --since 2023-10-24 07:35:00 --until 2023-10-24 08:05:00 -p err..crit需要重点关注的“天灾”线索日志关键词/模式可能的原因下一步调查方向Out of memory: Killed process内存耗尽内核OOM Killer杀进程检查/var/log/kern.log使用dmesg -T分析被杀进程的内存使用模式。kernel panic内核严重错误如驱动故障、硬件错误分析dmesg输出和/var/log/kern.log关注panic前的最后几条内核信息。watchdog: BUG: soft lockupCPU被某个进程长时间独占导致系统无响应结合top历史或sar数据分析当时CPU负载和进程状态。thermal throttling,CPU overheated硬件过热触发保护性关机检查服务器硬件监控IPMI/iDRAC、机房温度清理风扇灰尘。ACPI Error高级电源管理接口错误可能与BIOS设置、特定硬件兼容性有关尝试更新BIOS或内核。filesystem read-only,I/O error磁盘故障使用smartctl检查磁盘健康度查看dmesg中的磁盘错误信息。3. 实战案例拆解一次真实的“午夜重启”调查让我们通过一个虚构但典型的案例串联上述技巧。运维人员发现一台运行Web服务的Ubuntu 22.04服务器在2023-11-11 02:30左右无故重启。第一步确定启动记录journalctl --list-boots | grep “Nov 11”输出显示在02:35有一次启动Boot ID:xyz...。那么我们需要调查的就是这次启动之前的那次运行会话假设Boot ID为abc...。第二步检查上次会话的关机线索sudo journalctl -b abc... --grepshutdown\|reboot\|logind --reverse | head -20输出中未发现用户触发的明确记录排除了人为误操作。第三步检查错误和内核消息# 查看重启前15分钟内的严重错误 sudo journalctl -b abc... --since “2023-11-11 02:15:00” --until “2023-11-11 02:35:00” -p err..crit输出中发现多条Nov 11 02:28:17 webserver kernel: Out of memory: Killed process 12345 (java) total-vm:8000000kB, anon-rss:7800000kB, file-rss:0kB, shmem-rss:0kB Nov 11 02:30:01 webserver kernel: systemd[1]: Started Session 100 of user root. Nov 11 02:31:22 webserver kernel: PM: Preparing system for sleep分析在02:28系统因内存耗尽OOM杀死了一个Java进程。但系统并未立即重启。随后在02:31日志显示系统进入了睡眠状态sleep。对于服务器这极不正常通常意味着触发了某种电源管理策略。第四步深入调查电源管理相关日志sudo journalctl -b abc... _SYSTEMD_UNITsystemd-logind.service --since “02:25” --until “02:35” --no-pager发现关键行Nov 11 02:30:55 webserver systemd-logind[1001]: Lid closed.真相大白这是一台笔记本电脑冒充的服务器它配置了“合盖睡眠”的策略。在02:28经历OOM杀进程后系统可能已经不稳定。随后在02:30:55有人或物体意外合上了笔记本盖子触发了睡眠。而睡眠/唤醒过程在内存状态异常时可能失败最终导致系统重启。解决方案短期禁用笔记本的合盖睡眠sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target。根本解决Java应用的内存泄漏问题增加监控并将服务迁移到真正的服务器硬件上。4. 构建你的排查工具箱与自动化监控手动排查虽强但 proactive主动 比 reactive反应 更重要。我们可以将一些检查模式脚本化并设置自动化监控。4.1 常用排查命令速查脚本创建一个脚本比如investigate_reboot.sh一键化收集关键信息#!/bin/bash # 调查最近一次异常重启的原因 echo “ 1. 系统启动历史 journalctl --list-boots | head -5 LAST_BOOT$(journalctl --list-boots -1 -0 | awk ‘{print $1}‘ | head -1) echo -e “\n 2. 分析上一次启动会话 (Boot ID: $LAST_BOOT) echo -e “\n— 关键关机/重启信号 —” sudo journalctl -b $LAST_BOOT --grep“shutdown\|reboot\|poweroff\|logind.*Power\|logind.*Handle” --no-pager | tail -10 echo -e “\n— 重启前10分钟的错误及更高优先级日志 —” sudo journalctl -b $LAST_BOOT --since“-10 minutes” -p err..crit --no-pager echo -e “\n— 内核OOM及Panic信息 —” sudo journalctl -b $LAST_BOOT --grep“Out of memory\|kernel panic” --no-pager echo -e “\n 3. 当前dmesg中可能残留的之前会话的错误 dmesg -T | grep -E “error|panic|oom|critical” | tail -20给脚本执行权限后一旦发生异常重启运行它就能快速获得第一份“现场报告”。4.2 配置日志告警规则对于生产服务器可以使用像Logwatch、PrometheusAlertmanager或Elastic StackELK这样的工具设置针对关键日志模式的告警。例如一个简单的systemd服务单元结合journalctl的--follow和--since可以实时监控# 示例一个监控OOM事件的简易服务概念 # 在 /etc/systemd/system/oom-monitor.service 中 [Unit] DescriptionMonitor for OOM events [Service] ExecStart/bin/bash -c ‘journalctl --follow --identifierkernel | grep --line-buffered “Out of memory” | while read line; do echo “CRITICAL: $line” | mail -s “OOM Alert on $(hostname)” adminexample.com; done‘ Restartalways [Install] WantedBymulti-user.target更成熟的做法是使用Prometheus的node_exporter收集系统指标并结合alertmanager规则当可用内存低于阈值或检测到特定日志模式时触发告警。排查系统异常关机重启就像侦探破案。journalctl是你的放大镜和指纹鉴定工具而清晰的排查思路则是你的推理逻辑。从确定时间窗口到层层过滤日志再到关联进程和用户最后结合内核消息做出判断这个过程需要耐心和细心。记住日志不会说谎但它需要被正确地提问。掌握这套方法下次再面对“幽灵重启”时你就能从容地翻开日志让数据自己说出真相。

相关新闻

海康VisionMaster硬件选型避坑指南:从相机到光源的实战经验分享

海康VisionMaster硬件选型避坑指南:从相机到光源的实战经验分享

海康VisionMaster硬件选型避坑指南:从相机到光源的实战经验分享 刚接触机器视觉项目,很多人会把精力都放在算法和软件调试上,结果项目卡在第一步——硬件选型。我见过太多案例,工程师花了几周时间调算法,最后发现是相机…

2026/5/17 11:36:40 阅读更多 →
从OpenMax到极值理论:揭秘开集识别如何为深度网络装上“未知探测器”

从OpenMax到极值理论:揭秘开集识别如何为深度网络装上“未知探测器”

1. 当你的模型“睁眼瞎”:闭集分类在现实世界中的尴尬 咱们先来聊一个我亲身经历过的场景。几年前,我参与了一个智能安防摄像头的项目,核心任务是人脸识别门禁。我们花了大力气,收集了公司所有员工的人脸照片,大概几百…

2026/7/5 2:52:52 阅读更多 →
OpenPDF实战指南:Java高效生成PDF的进阶技巧

OpenPDF实战指南:Java高效生成PDF的进阶技巧

1. 从基础到进阶:为什么OpenPDF值得深入 如果你已经用OpenPDF生成过几个简单的PDF文档,比如导出个数据表格或者做个简单的报告,那你肯定已经感受到了它的方便。依赖一加,几行代码一写,一个PDF文件就出来了,…

2026/7/5 5:47:54 阅读更多 →

最新新闻

HS工具箱深度评测:一站式在线工具平台如何提升开发与办公效率

HS工具箱深度评测:一站式在线工具平台如何提升开发与办公效率

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 你是不是也遇到过这样的场景:开发时突然需要把图片转成Base64编码,临时去搜在线工具,结果要么广告…

2026/7/6 11:29:59 阅读更多 →
数字图像处理 2.6 节:图像采样量化实战,Python 实现 8-bit 灰度图转换与伪轮廓分析

数字图像处理 2.6 节:图像采样量化实战,Python 实现 8-bit 灰度图转换与伪轮廓分析

数字图像处理实战:Python实现8-bit灰度图转换与伪轮廓分析当一张风景照片在显示器上呈现出明显的阶梯状色块时,我们看到的正是数字图像处理中典型的"伪轮廓"现象。这种现象源于图像量化过程中的信息损失,而理解其背后的原理对于从事…

2026/7/6 11:27:57 阅读更多 →
STM32L152RE与TPAFE0808构建多通道信号采集系统

STM32L152RE与TPAFE0808构建多通道信号采集系统

1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是常见需求。TPAFE0808作为8通道模拟前端芯片,配合STM32L152RE低功耗MCU,能够构建高效的多通道信号控制系统。这种组合特别适合需要同时监测多个传感器…

2026/7/6 11:25:53 阅读更多 →
4万星和5.7万星的两个框架,我焊在一起后它们封神了

4万星和5.7万星的两个框架,我焊在一起后它们封神了

第一个,AI 在「要构建什么」还没想清楚的时候就开始写代码。你跟它讨论需求,聊了三轮,它突然来一句「我来帮你实现吧」,然后一顿输出,写完一看,方向跑偏了。代码能跑,但不是你想要的。删了重来&…

2026/7/6 11:25:53 阅读更多 →
Transformer 架构 6 大核心组件拆解:从位置编码到多头注意力数学推导

Transformer 架构 6 大核心组件拆解:从位置编码到多头注意力数学推导

Transformer架构6大核心组件深度解析:从数学原理到工程实现引言:重新定义序列建模的里程碑2017年,一篇名为《Attention Is All You Need》的论文彻底改变了自然语言处理领域的游戏规则。Transformer架构的提出不仅终结了RNN/CNN在序列建模中的…

2026/7/6 11:25:53 阅读更多 →
如何用Squirrel-RIFE轻松实现专业级视频补帧:从入门到精通的完整指南

如何用Squirrel-RIFE轻松实现专业级视频补帧:从入门到精通的完整指南

如何用Squirrel-RIFE轻松实现专业级视频补帧:从入门到精通的完整指南 【免费下载链接】Squirrel-RIFE 效果更好的补帧软件,显存占用更小,是DAIN速度的10-25倍,包含抽帧处理,去除动漫卡顿感 项目地址: https://gitcod…

2026/7/6 11:23:51 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻