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

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

如果 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

参考:Launchpad 错误报告评论

相关内容