Answers:
当某些事情发生时,Gnome屏幕保护程序会在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
。另外,如果您将其作为守护程序运行,则应确保一次仅运行一个实例(例如带有锁定文件的实例),并使用清除脚本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用作桌面环境,则必须监听interface 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