![systemd 日志可以根据解析的日志行触发操作吗?](https://linux22.com/image/180162/systemd%20%E6%97%A5%E5%BF%97%E5%8F%AF%E4%BB%A5%E6%A0%B9%E6%8D%AE%E8%A7%A3%E6%9E%90%E7%9A%84%E6%97%A5%E5%BF%97%E8%A1%8C%E8%A7%A6%E5%8F%91%E6%93%8D%E4%BD%9C%E5%90%97%EF%BC%9F.png)
有时,我的笔记本电脑在合上盖子后不会进入睡眠状态。造成这种情况的原因各不相同,但通常是由于驾驶员状态不佳所致。我目前无法知道存在问题,直到几个小时后我打开笔记本电脑时,它要么完全耗尽电池并硬关闭电源,要么电池严重耗尽。
我想创建一个规则,以便针对某些预定的日志行或模式采取操作,例如运行脚本来生成声音警报。理想情况下,这应该是基于事件而不是轮询,如果可能的话,最好避免设置系统日志配置来实现这一点。
示例日志行包括:
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