如何获取系统上次休眠/挂起/恢复的日期/时间?

如何获取系统上次休眠/挂起/恢复的日期/时间?

如何获取这些事件的日期/时间:

  • 上次系统休眠/挂起
  • 上次系统恢复

答案1

您可以检查系统日志文件/var/log/syslog中是否存在指示挂起/休眠/恢复事件的消息并查看它们的时间戳。

对于暂停和恢复,请检查例如以下模式:

grep -E 'PM: suspend (entry|exit)' /var/log/syslog

示例输出:

Sep  8 09:43:26 type40mark3 kernel: [150509.893804] PM: suspend entry (deep)
Sep  8 15:03:39 type40mark3 kernel: [150514.147721] PM: suspend exit
Sep  8 16:33:41 type40mark3 kernel: [155914.275076] PM: suspend entry (deep)
Sep  8 17:04:58 type40mark3 kernel: [155919.343276] PM: suspend exit

这只会检查当前的 syslog 文件,但由于它会进行日志轮换,较旧的消息将存档在编号和压缩文件中,如/var/log/syslog.1/var/log/syslog.2.gz。要一次检查所有这些文件,请使用zgrep,它可以读取压缩文件,并按sort实际时间戳日期按顺序恢复它们:

zgrep -hE 'PM: suspend (entry|exit)' /var/log/syslog* | sort -M

为了仅获取最后两行(通常是最后的暂停和恢复),您可以附加| tail -n 2到上述任一命令。

如果您只想要暂停或仅恢复,请相应地将过滤器模式更改为例如PM: suspend entryPM: suspend exit


我现在没有可用的休眠系统来搜索该事件的适当消息,但我期望有类似的东西。尝试搜索例如grep hiber /var/log/syslog以找到合适的模式。如果您有,请发表评论,我很乐意将其添加到此答案中以供将来参考。

但是请注意时间戳并将其与您知道的实际时间进行比较,因为某些“延迟”消息systemd[1]: Started Suspend.可以在系统实际关闭之前触发,但实际上会与系统再次打开时的时间戳一起记录并写入磁盘。

答案2

正如我对 Byte Commader 的回复所评论的那样,出于某种原因,至少在我的两个 Ubuntu 16 安装中,似乎“PM:暂停”和“PM:恢复”事件都在恢复期间写入系统日志。因此,该解决方案中的暂停时间与恢复时间在一秒之内。但是,恢复时间是正确的。

因此,此解决方案不基于日志文件。它基于持续运行的非常简单的服务,并监控睡眠前后的时间差。如果差异比睡眠时间大得多,则表示发生了“暂停”,例如暂停/恢复操作。当时间同步时,唤醒后会记录暂停。

pauselogger.sh

set -e

if [[ "$#" < 1 || "$#" > 1 ]]
then
    echo "Illegal number of parameters"
    echo "Usage $0 <sleeptime in seconds>"
    exit 1
fi

sleepTime=$1
fileName="/var/log/state.log"

dateStr1=$(date "+%Y-%m-%d %T.%N %z %s")
dateInt1=$(echo $dateStr1 | cut -d' ' -f4)
dateInt2=$dateInt1
dateStr2=$dateStr1
diff=0
for (( ; ; ))
do
    diff="$(($dateInt1-$dateInt2))"
    maxDiff=$(echo $sleepTime*1.1 + 1 | bc) # Pause is 10% longer than sleep.
    if (( $(echo "$diff > $maxDiff" |bc -l) )); then  
        echo "$dateStr2 DOWN pre sleep" >> $fileName
        echo "$dateStr1 UP post sleep $diff" >> $fileName       
    fi

    dateStr2=$dateStr1
    dateInt2=$dateInt1

    sleep $sleepTime

    dateStr1=$(date "+%Y-%m-%d %T.%N %z %s")
    dateInt1=$(echo $dateStr1 | cut -d' ' -f4)

done

服务定义也是简单的文件:/etc/systemd/system/pauselogger.service

[Unit]
Description=Simple Pause Logger

[Service]
ExecStart=/usr/sbin/pauselogger.sh 30
Restart=on-failure

[Install]
WantedBy=multi-user.target

然后启动并启用记录器:

sudo systemctl start pauselogger
sudo systemctl enable pauselogger

日志档案:

2019-09-13 00:44:17.602146211 +0300 1568324657 UP post sleep 225
2019-09-13 01:04:59.968326886 +0300 1568325899 DOWN pre sleep
2019-09-13 10:25:18.575107533 +0300 1568359518 UP post sleep 33619
2019-09-13 10:49:41.594151484 +0300 1568360981 DOWN pre sleep
2019-09-13 10:51:57.129617072 +0300 1568361117 UP post sleep 136

优点此解决方案的优点在于,即使有暂停命令,它也能正常工作。如果使用操作系统级别的挂起/休眠/恢复,它会记录暂停,但如果在虚拟机内部使用,例如 VirtualBox savestate/resume,它也能正常工作。

缺点至少两个日志条目都是在唤醒期间写入的,这种解决方案不适用,例如,如果需要在保存状态操作之前启动脚本。此外,不记录导致睡眠/唤醒的命令:OS 挂起 vs VirtualBox 保存状态或 OS 恢复 vs VirtualBox 启动。

相关内容