who -b 是首选,因它直接读取内核启动时写入 /var/run/utmp 的原始时间戳,不依赖日志、无需 root 权限、输出稳定且语义明确,精度达分钟级,抗干扰性强。

who -b 是最直接、最可靠的方式查看系统上一次重启时间,不需要 root 权限,不依赖日志轮转或 systemd,输出稳定且语义明确。
为什么 who -b 是首选
它读取的是内核启动时写入 /var/run/utmp 的原始记录,不是推算值,也不是日志解析结果。相比 uptime -s(只显示启动时间戳)或 last reboot(依赖 /var/log/wtmp 是否被清理),who -b 更轻量、更抗干扰。
-
uptime -s和who -b通常输出一致,但某些嵌入式或精简系统可能不维护utmp,此时who -b无输出而uptime -s仍可用 -
last reboot显示历史多次重启,但若wtmp被logrotate清空或手动删过,就会丢记录 -
journalctl --list-boots仅适用于启用journald且未配置Storage=volatile的系统
who -b 的典型输出与字段含义
运行后你会看到类似:
system boot 2026-03-26 14:33
注意三点:
- 固定前缀
system boot,不可省略或用正则模糊匹配——有些系统(如旧版 CentOS)可能输出为run-level 3 2026-03-26 14:33,这时who -b就不适用 - 时间是本地时区,不是 UTC,和
date输出一致;若需 UTC 时间,得靠date -d "$(who -b | awk '{print $3, $4}')" -u +%F\ %T这类组合 - 没有毫秒精度,只到分钟级;内核实际启动时间可能早几十毫秒,但对运维判断“是否刚重启过”完全够用
常见失效场景与替代方案
当 who -b 返回空或报错(比如 who: no utmp entry),说明 utmp 未被初始化或被禁用。这时可按优先级尝试:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 先试
uptime -s:它读/proc/uptime+ 系统时钟,几乎总能返回有效时间戳 - 再试
stat /proc | grep Modify:/proc目录的Modify时间通常等于启动时间,但某些容器环境会伪造该时间 - 最后看
last reboot | head -n1:如果wtmp存在且未损坏,这是唯一能确认“是否人为重启过”的方式(who -b和uptime -s都无法区分内核 panic 后自动重启 vs 手动 reboot)
脚本中安全提取时间的写法
别直接用 awk '{print $3, $4}'——万一输出格式变动(如带 weekday),字段就偏了。稳妥做法是:
who -b 2>/dev/null | sed -n 's/system boot //p'
这个命令:
- 用
2>/dev/null屏蔽错误输出,避免空结果时污染管道 - 用
sed -n 's/...//p'精确剥离固定前缀,不依赖空格分隔 - 结果可直接传给
date -d或写入监控日志,无需额外 trim
真正容易被忽略的点是:who -b 不反映“上次人为执行 reboot 的时间”,只反映“内核最后一次加载的时间”。如果系统因 panic 自动重启过,它不会告诉你中间发生了什么。

















