我的问题与这个问题相同,但我无法在 ubuntu 17.10 中使其运行:
我想运行一个脚本,在屏幕锁定时更改我的键盘 RGB 配置。该脚本运行完美。问题是获取锁定/解锁事件。我尝试使用 dbus-monitor,如该问题中所述,并如这里所述:
https://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html
因此运行这个脚本:
#!/bin/bash
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \
( while true
do read X
if echo $X | grep "boolean true" &> /dev/null; then
echo "locking at $(date)" >> $HOME/time_xprofile
elif echo $X | grep "boolean false" &> /dev/null; then
echo "unlocking at $(date)" >> $HOME/time_xprofile
fi
done )
但它只起作用...几次(!)....我不明白发生了什么。
我在 X-server(没有 Wayland)上使用 ubuntu 17.10 和 ubuntu 的 gnome,并尝试了 vanilla gnome,遇到了同样的问题。
我也尝试过:
dbus-monitor > out.log
查看锁定/解锁时发生的所有痕迹,但似乎没有出现该信号...只有....嗯...很少几次...
我不知道现在该怎么办,任何建议都会有帮助。
答案1
假设您正在使用 Gnome,那么我认为现在最好听取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 [])
答案2
使用 gnome-screensaver-dialog 进程的存在作为替代触发器
如果dbus
由于某种原因无法实现或不希望这样做,您可以使用该过程的存在gnome-screensaver-dialog
作为触发器。该过程在锁定屏幕上调用。
在 Python 脚本中:
#!/usr/bin/env python3
import psutil
import time
import subprocess
procname = "gnome-screensaver-dialog"
lock_command = "/path/to/lockscript"
unlock_command = "/path/to/unlockscript"
lock1 = None
while True:
time.sleep(2)
lock2 = procname in (p.name() for p in psutil.process_iter())
if lock2 != lock1:
if lock2:
subprocess.Popen(lock_command)
print("locked")
else:
subprocess.Popen(unlock_command)
print("unlocked")
lock1 = lock2
如何使用
- 将脚本复制到一个空文件中,另存为
locktoggle.py
在头部部分:
lock_command = "/path/to/lockscript" unlock_command = "/path/to/unlockscript"
设置您想要运行的脚本的命令或路径(保留双引号!)
使用以下命令测试运行脚本:
python3 /path/to/locktoggle.py
注意:如果您只对事件 lock/unlock 之一运行命令,只需注释掉该部分中的相应行即可:
if lock2 != lock1:
if lock2:
# subprocess.Popen(lock_command)
print("locked")
else:
# subprocess.Popen(unlock_command)
print("unlocked")