有时,我的笔记本电脑在合上盖子后不会进入睡眠状态。造成这种情况的原因各不相同,但通常是由于驾驶员状态不佳所致。我目前无法知道存在问题,直到几个小时后我打开笔记本电脑时,它要么完全耗尽电池并硬关闭电源,要么电池严重耗尽。
我想创建一个规则,以便针对某些预定的日志行或模式采取操作,例如运行脚本来生成声音警报。理想情况下,这应该是基于事件而不是轮询,如果可能的话,最好避免设置系统日志配置来实现这一点。
示例日志行包括:
can't change power state from D3cold to D0
can't change power state from D3hot to D0
答案1
我找到了一种方法来完成这项工作,并且无需使用日志进行任何日志解析,这确实不是一个好主意。
相反,我利用了系统睡眠钩子并用它来检查日志,以确定在唤醒时的最后几分钟内是否有失败的睡眠。在这种情况下,将播放音频文件。
我的工具位于https://gitlab.com/jinnko/failed-sleep-alarm。
关键是要有一个脚本,/lib/systemd/system-sleep/
该脚本将在任何睡眠、挂起或休眠之前和之后触发。然后该脚本可以检查日志并采取行动。就我而言,脚本如下所示(检查存储库以获取最新版本):
#!/usr/bin/env bash
set -euo pipefail
logger -s -p kern.debug "Invoked $(realpath "$0") $*"
case $1/$2 in
post/*)
if /usr/bin/journalctl --since "2m ago" | grep -E "Failed to start (Hibernate|Sleep|Suspend)"; then
amixer -q sset Master unmute
amixer sset Master '35%'
for i in {1..3}; do
mpg123 -q /usr/share/failed-sleep-alarm/pig.mp3
done
fi
;;
esac