sudo vim /usr/local/bin/boot_logger.sh
#!/bin/bash
# 定义日志文件路径
LOG_FILE="/var/log/boot_history.log"
# 创建日志目录(如果不存在)
sudo mkdir -p "$(dirname "$LOG_FILE")"
sudo touch "$LOG_FILE"
sudo chmod 666 "$LOG_FILE" # 为了让普通用户也能写入,生产环境建议更严格的权限
# 获取当前时间戳
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# 获取设备启动时间(系统已运行时间)
UPTIME=$(uptime -s)
# 获取内核启动信息(dmesg中最早的信息)
# 使用 tail 和 head 精确抓取内核启动的第一行时间戳
# 注意:dmesg 的时间戳是系统启动后的秒数
BOOT_TIME_FROM_DMESG=$(dmesg | tail -n 50 | grep -m 1 "\[" | awk '{print $1}' | tr -d '[]' | head -c 12)
# 将相对时间转换为绝对时间(近似值)
if [ -n "$BOOT_TIME_FROM_DMESG" ]; then
# 这是一个近似计算,将系统启动时间减去dmesg中的时间戳,得到绝对时间
BOOT_EPOCH=$(date -d "$UPTIME" +%s)
DMESG_EPOCH=$(echo "$BOOT_EPOCH - $BOOT_TIME_FROM_DMESG" | bc)
BOOT_DATETIME=$(date -d "@$DMESG_EPOCH" '+%Y-%m-%d %H:%M:%S' 2>/dev/null || echo "N/A")
else
BOOT_DATETIME="N/A"
fi
# 将信息写入日志文件
echo "=================================" | tee -a "$LOG_FILE"
echo "系统启动记录" | tee -a "$LOG_FILE"
echo "记录时间: $TIMESTAMP" | tee -a "$LOG_FILE"
echo "系统启动时间 (uptime): $UPTIME" | tee -a "$LOG_FILE"
echo "内核启动时间 (近似值): $BOOT_DATETIME" | tee -a "$LOG_FILE"
echo "---------------------------------" | tee -a "$LOG_FILE"
# 记录上一次的关机记录(如果存在上次会话)
LAST_SHUTDOWN=$(last -x | grep shutdown | head -n 1)
if [ -n "$LAST_SHUTDOWN" ]; then
echo "上次关机记录: $LAST_SHUTDOWN" | tee -a "$LOG_FILE"
else
echo "上次关机记录: 未找到(可能是断电)" | tee -a "$LOG_FILE"
fi
echo "" | tee -a "$LOG_FILE"
sudo chmod +x /usr/local/bin/boot_logger.sh
sudo vim /etc/systemd/system/boot-logger.service
[Unit]
Description=Log boot time for power failure diagnosis
After=syslog.target network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/boot_logger.sh
RemainAfterExit=no
StandardOutput=journal
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable boot-logger.service
sudo systemctl start boot-logger.service
cat /var/log/boot_history.log
rk3588监控断电情况
最新推荐文章于 2025-12-03 12:28:21 发布
95

被折叠的 条评论
为什么被折叠?



