Light Locker - 在屏幕锁定/解锁时运行脚本

jno*_*cho 8 xfce screen-lock xubuntu

如果 XFCE 会话被锁定和解锁,我想运行一个脚本。有没有办法在桌面锁定或解锁时拦截它并执行某些操作?

我找到了以下解决方案:

对于 Gnome -在屏幕锁定/解锁时运行脚本

for xscreensaver-如何在解锁时运行脚本?

但是我正在使用light-locker并且没有屏幕保护程序。我试图监视 DBUS,但它似乎没有light-locker发出任何信号。

一种选择是修改,xflock4但这只会有助于屏幕锁定。

有什么办法light-locker吗?

Pau*_*gão 6

基于Brent Roman的回答,我实现了一个脚本dbus-monitor,然后用 替换了它gdbus,它具有更清晰的界面和更清晰的输出。该脚本相当长,我将删除与 dbus 无关的任何内容,以说明在屏幕解锁时运行脚本的意义。

首先是 running 的示例输出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 [])
Run Code Online (Sandbox Code Playgroud)

所以,脚本骨架:

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 [])
Run Code Online (Sandbox Code Playgroud)

函数kill_running检查是否有一个实例正在运行并杀死它。如果脚本在每次 lightdm 登录时自动启动,我们可能会运行多个实例,因此需要在启动之前终止所有当前实例。

如果安装的 USB 设备(带有我的音乐收藏)已重置(从挂起恢复后随机发生),则函数会check_quodlibet重新启动quodlibet。我不认为包含它是相关的。

exec运行时,gdbus是不是绝对必要的,但后来它避免了额外的过程,因为脚本将运行前叉本身gdbus。这样,将只有 2 个进程在运行:脚本本身和gdbus.

我创建了~/.config/autostart/quodr.desktopquodr是脚本的名称)以在每次 lightdm 登录时启动脚本:

[Desktop Entry]
Version=1.0
Type=Application
Name=quodr
Exec=quodr
Comment=Check if quodlibet needs refresh
Icon=dialog-question-symbolic
Hidden=false
Run Code Online (Sandbox Code Playgroud)

作为对自己的 TODO:我打算研究如何将脚本作为 systemd 用户服务启动,D-Bus 激活。

这个带有所有答案的问题对我达成这个解决方案来说是无价的。这个问题困扰了很长时间,我尝试了很多解决方案,但是在阅读了每个人在这里写的内容后,我才更清楚地了解什么是必要的。感谢大家,尤其是 Brent Roman

作为最后的评论,我在调查这个时构建并安装了d-feet and bustle,它们真的很有用。

我正在运行Xubuntu 17.10

  • 我已经设法在 systemd 的用户实例下运行脚本(我将其命名为 _quodr_),这使我能够从脚本中删除重新启动逻辑和日志记录。所以,我删除了`function log`、`LOGFILE`和`function kill_running`,然后创建了_~/.config/systemd/user/quodr.service_:`[Unit] Description=Refresh quodlibet after unlock [Service] ExecStart=/ home/paulo/bin/quodr Restart=always RestartSec=10 [Install] WantedBy=desktop.target` 然后启用并启动它:`systemctl --user enable quodr.service systemctl --user start quodr.service` (2认同)

小智 5

上一个答案帮助我编写了这段 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
Run Code Online (Sandbox Code Playgroud)