スリープ イベントを監視するにはどうすればよいでしょうか?

スリープ イベントを監視するにはどうすればよいでしょうか?

モニターがスリープ状態に設定されているときに接続できるイベントはありますか? PC のスリープ/サスペンドではなく、モニターの DPMS スリープのみを意味します。

私の意図は、モニターがスリープ状態になっているが PC がまだオンになっているときにスクリプトを実行することです。

同様に、モニターがスリープから復帰したときにトリガーされるイベントはありますか?

答え1

xset -qモニターがオンかオフかがわかります。

通常は、「モニターはオンです」と表示されます。ただし、モニターをオフにしてからコマンドを実行すると、オフになっていることが通知されます。

次のように入力して試してください:

sleep 1; xset dpms force off; sleep 1; xset -q

(sleepコマンドは、X がイベントの順序を混同するのを防ぐためにあります)。次に、マウスを小刻みに動かして画面を元に戻します。

スクリプトでは、 を実行すると、または の$(xset -q|grep Monitor|awk '{print $3;}')いずれかの変数が提供されます。OnOff

X非常に複雑なものですが、私のシステムでは毎回正常に動作します。

答え2

私は今日、1週間ほどでもっと良い答えが得られるかもしれないbashスクリプトを作成しています。その間に、これを見つけましたRedditの回答bash スクリプトでは次のように使用できます:

#!/bin/bash
jsdev=${1:-"/dev/input/js0"}
getxss() {
    xset q | grep -e 'timeout\:\|Standby\:' \
        | awk '{a[NR]=$1}END{asort(a);print a[1]}' RS=' '
}
tellit() { notify-send "controller xss holder" "${1:-"date"}: $(date +%T)"; }
fin() { tellit "${1:-"bye"}"; exit; }
trap 'fin "sigint recieved"' INT
slt=$((($(getxss)/5)*4)); [ $slt -lt 1 ] && slt=1; w=60
until [[ -e "$jsdev" || $w -lt 1 ]]; do
    t=$(date +%s); f="$(inotifywait -qq -e create --format '%w%f' -t $w "$(dirname $jsdev)")"
    [ "$f" == "$jsdev" ] && break || t=$(($(date +%s)-$t)) && ((w-=$t))
done; [ $w -lt 1 ] && fin "dev not found" && exit
tellit "connected"; while [ -e "$jsdev" ]; do
    read -rn1< <(jstest --nonblock "$jsdev" 2>/dev/null) \
        && [ -e "$jsdev" ] && xset -display :0 s reset dpms force on
    inotifywait -qq -e delete_self --format '%w%f' -t $slt $jsdev 2>/dev/null
done; fin "disconnected"

関連情報