답변:
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
. 어쨌든 대부분의 그놈 앱은 dbus를 광범위하게 사용하므로 많은 놀라운 일을 할 수 있습니다.
우분투 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 [])
우분투 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
. 또한 데몬으로 실행하는 경우 한 번에 하나의 인스턴스 만 실행되고 (예 : 잠금 파일 사용) 스크립트를 사용하여 스크립트를 정리합니다 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 / 플라즈마를 데스크탑 환경으로 사용하는 경우 인터페이스 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
.
이것이 우분투 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