Моей проблемой является тот же этот вопрос, но я не могу получить его работающий в человечности 17.10:
Как выполнить команду, или сценарий в экране блокируют/разблокируют?
Я хочу запустить скрипт, который изменяет мою клавиатуру конфигурация RGB в экранных блокировках. Безупречные выполнения сценария. Проблема должна получить событие блокировки/разблокирования. У меня есть попытка с помощью dbus-монитора, как сказано в том вопросе и, как сказано здесь:
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 )
Но это только работает... несколько раз (!).... Я не могу понять то, что происходит.
Я использую человечность 17.10 с гномом человечности по X-серверу (никакой Уэйленд) и имею гнома попытки ванили и имею ту же проблему.
У меня есть попытка также:
dbus-monitor > out.log
Для наблюдения ВСЕХ трассировок, которые происходят при блокировке/разблокировании и это не появляется тот сигнал... Только.... хорошо... буквально несколько раз...
Я не знаю, что сделать, знают, Любой совет будет полезен.
Если предположить, что вы используете 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 [])
Если 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"
установите команды или пути к скриптам, которые вы хотите запустить (оставьте двойные кавычки!)
Test - запустить скрипт с помощью команды:
python3 /path/to/locktoggle.py
NB Если вы запускаете команду только для одного из событий блокировки / разблокировки, просто закомментируйте соответствующую строку в разделе:
if lock2 != lock1:
if lock2:
# subprocess.Popen(lock_command)
print("locked")
else:
# subprocess.Popen(unlock_command)
print("unlocked")