systemd 로그가 구문 분석된 로그 줄을 기반으로 작업을 트리거할 수 있나요?

systemd 로그가 구문 분석된 로그 줄을 기반으로 작업을 트리거할 수 있나요?

때로는 덮개를 닫은 후에도 노트북이 절전 모드로 전환되지 않는 경우가 있습니다. 그 이유는 다양하지만 일반적으로 운전자의 부주의로 인해 발생합니다. 현재로서는 몇 시간 후 랩톱을 켤 때 배터리가 완전히 소모되고 전원이 꺼지거나 배터리가 심하게 소모될 때까지 문제가 있는지 알 방법이 없습니다.

청각적 경고를 생성하는 스크립트를 실행하는 등 미리 결정된 특정 로그 줄이나 패턴에 대해 조치를 취하는 규칙을 만들고 싶습니다. 이상적으로는 폴링보다는 이벤트 기반이어야 하며, 가능하다면 이를 달성하기 위해 syslog 구성을 설정하지 않는 것이 가장 좋습니다.

예제 로그 줄은 다음과 같습니다.

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

관련 정보