systemd 日志可以根据解析的日志行触发操作吗?

systemd 日志可以根据解析的日志行触发操作吗?

有时,我的笔记本电脑在合上盖子后不会进入睡眠状态。造成这种情况的原因各不相同,但通常是由于驾驶员状态不佳所致。我目前无法知道存在问题,直到几个小时后我打开笔记本电脑时,它要么完全耗尽电池并硬关闭电源,要么电池严重耗尽。

我想创建一个规则,以便针对某些预定的日志行或模式采取操作,例如运行脚本来生成声音警报。理想情况下,这应该是基于事件而不是轮询,如果可能的话,最好避免设置系统日志配置来实现这一点。

示例日志行包括:

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

相关内容