#!/bin/bash # 设备重启了 —— 查是掉电、还是崩溃、还是被谁重启的 set -u echo "════════ 1. 这次开机的起点 ════════" uptime | sed 's/^/ /' echo " 当前时间: $(date '+%m-%d %H:%M:%S')" echo " 开机时刻: $(uptime -s 2>/dev/null || echo '?')" echo echo "════════ 2. 上一次关机是干净的还是掉电 ════════" echo " --- last reboot ---" last -x reboot 2>/dev/null | head -6 | sed 's/^/ /' echo " --- last shutdown ---" last -x shutdown 2>/dev/null | head -4 | sed 's/^/ /' echo echo "════════ 3. 本次启动的日志开头(看有没有异常)════════" journalctl -b --no-pager 2>/dev/null | head -25 | sed 's/^/ /' echo echo "════════ 4. 有没有内核崩溃 / 掉电迹象 ════════" echo " --- 上次启动末尾(也就是重启前最后的日志)---" journalctl -b -1 --no-pager 2>/dev/null | tail -25 | sed 's/^/ /' echo echo " (如果上面是空的,说明上次的日志没落盘 —— 典型的直接掉电)" echo echo "════════ 5. dmesg 里的告警 ════════" dmesg 2>/dev/null | grep -iE 'error|warn|fail|thermal|voltage|under' | tail -12 | sed 's/^/ /' echo " (没输出=没有明显告警)" echo echo "════════ 6. 温度 / 电压(如果是过热或欠压会重启)════════" for f in /sys/class/thermal/thermal_zone*/temp; do [ -f "$f" ] && echo " $f: $(($(cat $f) / 1000))°C" done command -v vcgencmd >/dev/null 2>&1 && vcgencmd measure_temp 2>/dev/null | sed 's/^/ /' cat /sys/class/power_supply/*/voltage_now 2>/dev/null | while read v; do echo " 电压: $((v / 1000)) mV" done echo echo "════════ 7. 内存压力(OOM 会把系统搞挂)════════" free -m | sed 's/^/ /' echo " 本次启动有没有 OOM:" journalctl -b --no-pager 2>/dev/null | grep -ic 'out of memory\|oom-kill' | sed 's/^/ /' echo echo "════════ 8. 是不是被关机命令重启的 ════════" journalctl -b --no-pager 2>/dev/null | grep -iE 'shutdown|reboot|poweroff|systemd-logind' | head -8 | sed 's/^/ /' echo echo "════════ 9. 日志持久化了吗(掉电的话日志会丢)════════" echo " /var/log/journal 存在: $(if [ -d /var/log/journal ]; then echo 是; else echo '否(日志只在内存里,重启就没)'; fi)" echo " 当前 journal 占用: $(journalctl --disk-usage 2>/dev/null | sed 's/.*take up //' || echo '?')"