無論是排查核心恐慌、驗證維護窗口執行情況、還是計算系統可用性指標(SLA),準確獲取「最後一次重啟時間」都是 Linux 運維的基本功。本文介紹三種標準查詢方法,對比其輸出格式、適用場景與優缺點,並提供腳本化範例供自動化巡檢使用。
last reboot —— 歷史重啟完整時間線# last reboot
reboot system boot 5.10.0-21-amd64 Sat Jul 30 13:44 - 21:39 (46+07:55)
reboot system boot 5.10.0-21-amd64 Sun Apr 13 14:28 - 09:27 (107+18:59)
reboot system boot 5.10.0-21-amd64 Tue Mar 25 22:27 - 14:19 (18+15:52)
原理:/var/log/wtmp 記錄所有登入/登出事件。Linux 將每次開機視為一個特殊的「偽用戶」reboot 登入,因此查詢 reboot 的登入歷史即可得到完整重啟時間線。
優點:可見歷史所有重啟、每次運行時長、核心版本變更。
缺點:wtmp 會輪轉,舊記錄可能丟失;需人工解析輸出。
who -b —— 當前啟動時間最直接# who -b
system boot 2024-07-30 13:44
原理:讀取 /var/run/utmp(當前登入狀態),其中包含系統啟動記錄。
優點:輸出極簡、機器易解析、無歷史干擾。
缺點:僅顯示當前啟動時間,無歷史、無運行時長。
uptime —— 反推啟動時間# uptime
14:23:11 up 46 days, 8:02, 1 user, load average: 0.04, 0.05, 0.01
原理:顯示當前時間與系統已運行時長,用當前時間減去運行時長即得啟動時間。
優點:同時獲得負載資訊、登入用戶數。
缺點:需人工或腳本計算具體啟動時間點;高負載時運行時長顯示可能有秒級誤差。
| 維度 | last reboot | who -b | uptime |
|---|---|---|---|
| 輸出內容 | 完整歷史(含時長、核心版本) | 單行:啟動日期時間 | 當前時間、運行時長、負載、用戶數 |
| 機器可解析性 | 中(需 awk 切分) | 高(固定欄位) | 中(需計算) |
| 歷史追溯 | 支援(受 wtmp 輪轉限制) | 不支援 | 不支援 |
| 適用場景 | 審計、故障時間線重建 | 自動化巡檢、腳本取值 | 快速人工查看、負載關聯分析 |
#!/bin/bash
# 獲取當前啟動時間(ISO 8601 格式)
boot_time=$(who -b | awk '{print $3" "$4}')
# 獲取運行天數
up_days=$(uptime | grep -oP 'up \K[^,]+' | awk '{print $1}')
# 獲取最近一次重啟(last reboot 首行)
last_reboot=$(last reboot | head -1 | awk '{print $5,$6,$7,$8}')
echo "=== 系統重啟資訊 ==="
echo "當前啟動時間: $boot_time"
echo "已運行天數: $up_days"
echo "最近重啟記錄: $last_reboot"
echo "===================="
journalctl 查詢現代 systemd 發行版(RHEL 7+、Ubuntu 16.04+)可用:
# 最近一次啟動時間
journalctl --list-boots | head -1
# 或
journalctl -b -1 --no-pager | head -5
who -b 最直觀。last reboot 提供最豐富上下文。who -b 配合 awk 最穩健。uptime 同時掌握負載狀態,一條命令雙重收穫。掌握這三種方法並知曉其底層資料來源(wtmp/utmp//proc/uptime),你就能在任何 Linux 環境下秒級定位系統重啟歷史,為故障複盤、合規審計提供鐵證。