XFCEセッションがロックされているかロック解除されている場合は、スクリプトを実行したいと思います。デスクトップがロックされているかロック解除されているときにこの動作を傍受していくつかの操作を実行する方法はありますか?
次の解決策が見つかりました。
格言の場合 -画面がロックまたはロック解除されたときにスクリプトを実行する
xscreensaver
for-ロックが解除された場合、スクリプトをどのように実行できますか?
しかし、私はそれを使用していますが、light-locker
スクリーンセーバーはありません。 DBUSを監視しようとしていますlight-locker
が、信号はエクスポートされないようです。
1つのオプションは変更することですが、xflock4
これは画面ロックにのみ役立ちます。
回避策は何ですかlight-locker
?
答え1
確立されたブレントローマンを使用してスクリプトを実装dbus-monitor
し、gdbus
よりきれいなインターフェイスとよりきれいな出力を備えたに置き換えました。スクリプトはかなり長いので、画面のロックを解除するときのスクリプトの実行のポイントを説明するために、dbusに関連しないすべての項目を削除します。
gdbus
まず、以下は実行して画面をロックした後に画面のロックを解除する出力例です。
paulo@monk:~$ gdbus monitor --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1/session/c2
Monitoring signals on object /org/freedesktop/login1/session/c2 owned by org.freedesktop.login1
The name org.freedesktop.login1 is owned by :1.6
/org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': <false>}, @as [])
/org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Lock ()
/org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Unlock ()
/org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': <true>}, @as [])
したがって、スクリプトスケルトンは次のようになります。
OBJECT_PATH=/org/freedesktop/login1/session/$XDG_SESSION_ID
BUS_NAME=org.freedesktop.login1
UNLOCK="$OBJECT_PATH: $BUS_NAME.Session.Unlock ()"
GDBUS_MONITOR="gdbus monitor --system --dest $BUS_NAME --object-path $OBJECT_PATH"
PROGNAME=$(basename "$0")
LOGFILE=~/log/$PROGNAME.log
# ...
function log {
echo "$(date +'%F %T.%3N') [$$]" "$@"
}
# ...
function run_daemon {
exec &>>"$LOGFILE"
kill_running "$GDBUS_MONITOR"
local signal
while read -r signal; do
log "$signal"
if [[ $signal == "$UNLOCK" ]]; then
check_quodlibet
fi
done < <(eval "exec $GDBUS_MONITOR")
}
# ...
run_daemon
この関数は、kill_running
実行中のインスタンスがあることを確認し、インスタンスを終了します。 lightdmがログインするたびにスクリプトが自動的に起動されると、複数のインスタンスが実行されている可能性があるため、開始する前に現在のインスタンスをすべて終了する必要があります。
機能check_quodlibet
の再起動クワッドリベットマウントされたUSBデバイス(マイミュージックコレクションを含む)がリセットされた場合(一時停止から再開した後にランダムに発生する)、含めるのは適切ではないと思います。
exec
ランタイムはgdbus
必ずしも必要ではありませんが、スクリプトが実行される前にそれ自体が分岐するため、追加のプロセスが作成されるのを防ぎますgdbus
。これにより、スクリプト自体と2つのプロセスのみが実行されますgdbus
。
私が作る~/.config/autostart/quodr.desktop(グデルこれはスクリプトの名前です)lightdmがログインするたびにスクリプトを起動するには、次の手順を実行します。
[Desktop Entry]
Version=1.0
Type=Application
Name=quodr
Exec=quodr
Comment=Check if quodlibet needs refresh
Icon=dialog-question-symbolic
Hidden=false
私自身のための注意:D-Busアクティベーションシステムユーザーサービスでスクリプトを起動する方法を見てみましょう。
この質問とそれに対するすべての答えは、私がこの解決策を見つけるのに非常に重要でした。この問題は長い間私を悩ませており、多くの解決策を試みましたが、ここで誰もが書いた内容を読んだ後に必要なものがより明確にわかりました。特にみんなに感謝します。 ブレントローマン。
最後のコメントで、構築して設置しました。Dフィートそして忙しい私がこれを調べたとき、彼らは本当に役に立ちました。
私は走っているジュブント 17.10。
答え2
以前の回答は、現在のセッションのロックとロック解除のセッションイベントを処理するためにこのbashスクリプトを作成するのに役立ちました。セッションがロックされているときにブラウザプロセスを一時停止し、セッションがロック解除されたときに再起動するためにこの機能を使用します。不安定なDebian(Xfce 4.12)でテストされました。お楽しみください!
session=/org/freedesktop/login1/session/$XDG_SESSION_ID
iface=org.freedesktop.login1.Session
dbus-monitor --system "type=signal,path=$session,interface=$iface" 2>/dev/null |
while read signal stamp sender arrow dest rest; do
case "$rest" in
*Lock)
echo LOCKED at $stamp
pause $@
;;
*Unlock)
echo UNLOCKED at $stamp
resume $@
;; #unknown Session signal received
*)
# echo $signal $stamp $sender $arrow $dest $rest
esac
done
答え3
date
Light-Lockerを介してロックまたはロック解除されるたびに、次のコマンドが実行されます。ところで、ロックされているのか、開いているのかはわかりません。
dbus-monitor --system "type='signal',sender='org.freedesktop.login1',path='/org/freedesktop/login1/seat/seat0',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'" | grep --line-buffered "ActiveSession" | while read line; do date; done