如果 XFCE 会话被锁定和解锁,我想运行一个脚本。有没有办法可以在桌面锁定或解锁时拦截此行为并执行某些操作?
我找到了以下解决方案:
对于侏儒 -在屏幕锁定/解锁时运行脚本
为了xscreensaver
-如何在解锁时运行脚本?
但我正在使用light-locker
并且没有屏幕保护程序。我试图监控 DBUS,但似乎没有light-locker
发出任何信号。
一种选择是修改,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 激活的 systemd 用户服务启动。
这个问题及其所有答案对于我找到这个解决方案来说非常宝贵。这个问题困扰了很长一段时间,我尝试了很多解决方案,但在阅读了每个人在这里写的内容后,我才更清楚地了解了必要的内容。感谢大家,特别是 布伦特·罗曼。
作为最后的评论,我构建并安装了D 脚和忙碌当我对此进行调查时,它们确实很有用。
我在跑Xubuntu 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