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