如何获取这些事件的日期/时间:
- 上次系统休眠/挂起
- 上次系统恢复
答案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 entry
或PM: 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 启动。