回答:
Gnome-screensaverは、何かが発生するとdbusでいくつかのシグナルを出します。
ここにドキュメント(いくつかの例があります)。
次を実行するスクリプトを作成できます。
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
そして、それはあなたがいつでもdbus-monitor
ロック/ロック解除されている画面についての行を印刷します。
ここで、必要なことを行うためのbashコマンド:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) echo SCREEN_LOCKED;;
*"boolean false"*) echo SCREEN_UNLOCKED;;
esac
done
必要なものecho SCREEN_LOCKED
と交換echo SCREEN_UNLOCKED
するだけです。
gnome-screensaver-command
既にあります。を渡す-a
とgnome-screensaver-command
画面がロックされ、ロックを解除できます-d
。とにかく、ほとんどのgnomeアプリはdbusを広範囲に使用しているため、多くの驚くべきことを行うことができます。
ubuntu 14.04では、画面ロックのロック解除のDBusイベントが変更され、画面ロックおよびロック解除イベントにバインドするための新しいスクリプトは次のようになります
dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
while true; do
read X
if echo $X | grep "desktop-lock" &> /dev/null; then
SCREEN_LOCKED;
elif echo $X | grep "desktop-unlock" &> /dev/null; then
SCREEN_UNLOCKED;
fi
done
)
最近LockedHint
では、スクリーンセーバーのメッセージよりも聞く方が良いと思います。そうすれば、スクリーンセーバーの実装に縛られることはありません。
これを行う簡単なスクリプトを次に示します。
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint
これを与えます:
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])
Ubuntu 16.04:ozmaのソリューションはうまくいきませんでしたが、これはうまくいきました。
dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session,member=Unlocked" |
while read MSG; do
LOCK_STAT=`echo $MSG | awk '{print $NF}'`
if [[ "$LOCK_STAT" == "member=Unlocked" ]]; then
echo "was unlocked"
fi
done
既に与えられた答えを拡大する。
screen
またはtmux
セッション内からスクリプトを実行しようとする場合は、$DBUS_SESSION_BUS_ADDRESS
最初に正しいものを見つけて、のdbus-monitor
代わりに引数として渡す必要があります--session
。また、デーモンとして実行している場合は、一度に1つのインスタンスのみを実行し(ロックファイルを使用するなど)、スクリプトがを使用してクリーンアップすることを確認する必要がありますtrap
。次の例は、現在のほとんどのGnome環境でデーモンとして機能します(Ubuntu GNOME 16.04でテスト済み)。
#!/bin/bash
set -o nounset # good practice, exit if unset variable used
pidfile=/tmp/lastauth.pid # lock file path
logfile=/tmp/lastauth.log # log file path
cleanup() { # when cleaning up:
rm -f $pidfile # * remove the lock file
trap - INT TERM EXIT # * reset kernel signal catching
exit # * stop the daemon
}
log() { # simple logging format example
echo $(date +%Y-%m-%d\ %X) -- $USER -- "$@" >> $logfile
}
if [ -e "$pidfile" ]; then # if lock file exists, exit
log $0 already running...
exit
fi
trap cleanup INT TERM EXIT # call cleanup() if e.g. killed
log daemon started...
echo $$ > $pidfile # create lock file with own PID inside
# usually `dbus-daemon` address can be guessed (`-s` returns 1st PID found)
export $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s dbus-daemon)/environ)
expr='type=signal,interface=org.gnome.ScreenSaver' # DBus watch expression here
dbus-monitor --address $DBUS_SESSION_BUS_ADDRESS "$expr" | \
while read line; do
case "$line" in
*"boolean true"*) log session locked;;
*"boolean false"*) log session unlocked;;
esac
done
cleanup # let's not leave orphaned lock file when the loop ends (e.g. dbus dies)
これがうまくいかない場合は、次の理由が考えられます。
Kubuntuを使用している場合、またはデスクトップ環境としてKDE / Plasmaを使用している場合、インターフェイスをリッスンする必要があるorg.freedesktop.ScreenSaver
ため、そのイベントをリッスンするためのスクリプトは次のようになります。
dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) echo SCREEN_LOCKED;;
*"boolean false"*) echo SCREEN_UNLOCKED;;
esac
done
Personalization>Notifications>Notifications>Screensaver
。
upstart
セッションジョブのサポートdesktop-lock
とスタンザのdesktop-unlock
イベントstart on
。以下の例のように、$XDG_CONFIG_HOME/upstart/
または$HOME/.config/upstart
以下の例のように呼び出す関連トリガーとコマンドを使用して、ユーザー用のジョブ.confを作成します。
description "some job description"
start on desktop-lock
script
/path/to/your/executable
end script
これがubuntu 16.04で私のために働いたものです
dbus-monitor --session "type=signal,interface=org.gnome.ScreenSaver" |
while read MSG; do
LOCK_STAT=`echo $MSG | grep boolean | awk '{print $2}'`
if [[ "$LOCK_STAT" == "true" ]]; then
echo "was locked"
else
echo "was un-locked"
fi
done