journalctl -b
每次系统启动,内核与 systemd 都会生成一个唯一的 boot ID,本次启动写下的所有日志都带上这个 ID。journalctl -b 就是按 boot ID 过滤日志:不带参数看当前这次启动,-b -1 看上一次,--list-boots 把所有轮次列出来。排查「重启之后服务起不来」这类问题时,先锁定轮次再逐轮比对,能直接看出问题是哪一次变更引入的。
基本信息
| 用途 | 按系统启动轮次过滤日志 |
|---|---|
| 语法 | journalctl -b [序号];序号从 --list-boots 的 IDX 列读取 |
| 所属 | systemd(journalctl 与 systemd-journald) |
| 前提 | 历史轮次需要 journal 持久化,否则重启后旧日志即丢失 |
典型使用场景
- 重启后排障:服务启动失败,先确认失败发生在哪一次启动,再去那一轮里找原因
- 变更比对:对比昨晚与今早两轮启动的日志,定位是哪一次发布引入的问题
- 崩溃取证:机器意外重启后,上一轮的末尾日志是判断是内核 panic 还是断电的关键
- 启动耗时分析:配合 systemd-analyze 看哪一轮变慢、哪个单元拖了时间
- 回滚验证:回滚后重启,比对前后两轮的错误条目确认问题消失
常用示例
常用示例
journalctl --list-boots # 列出所有启动轮次(0 是当前,负数往前)
journalctl -b -1 -p err # 上一次启动里的错误及以上
journalctl -b -1 -n 100 --no-pager # 上一次启动的最后 100 行
journalctl -b -1 -S '2026-10-12 09:00' -U '2026-10-12 10:00' # 指定时段
journalctl -b -1 -o short-precise -n 20 # 精确到微秒看关机前最后时刻
journalctl -b -1 -u nginx --no-pager # 只看某个单元在上一次启动的表现输出逐列读法
| 列 | 含义 | 怎么看 |
|---|---|---|
| IDX | 轮次序号,0 为当前启动,-1 为上一次 | 命令里就用这个数字写 -b |
| BOOT ID | 内核分配的启动标识 | 同一台机器两次启动的 ID 必然不同 |
| FIRST ENTRY | 该轮最早的日志时间 | 据此判断机器是什么时候起来的 |
| LAST ENTRY | 该轮最后的日志时间 | 与重启时间比对可算出异常关机时长 |
只有持久化日志才能跨重启查看历史轮次:/var/log/journal 目录存在时 journald 才写磁盘。容器里的启动轮次由宿主决定,容器内用 -b 往往只能看到容器自己的那一段,排查要回到宿主机视角。
在没启用持久化的机器上执行 -b -1 会直接返回空结果,这不是「上次启动没有错误」,而是根本没有历史数据,别据此下结论。