Как запустить скрипт при блокировке / разблокировке экрана в ubuntu 17.10

Моя проблема аналогична этому вопросу, но я не могу заставить ее работать в 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

Чтобы увидеть ВСЕ следы, возникающие при блокировке / разблокировке, и не появляется этот сигнал ... Только .... ну ... очень мало ...

Я не знаю, что делать, любые советы будут полезны.

2
задан 13 November 2017 в 20:34

4 ответа

Предполагая, что вы используете 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
ответ дан 18 July 2018 в 03:40

Предполагая, что вы используете 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
ответ дан 24 July 2018 в 17:54

Использовать существование диалога gnome-screensaver процесса в качестве альтернативного триггера

Если 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

NB Если вы только запускаете команду на одном из событий блокировки / разблокировки, просто закомментируйте соответствующую строку в разделе:

if lock2 != lock1: if lock2: # subprocess.Popen(lock_command) print("locked") else: # subprocess.Popen(unlock_command) print("unlocked")
3
ответ дан 18 July 2018 в 03:40

Использовать существование диалога gnome-screensaver процесса в качестве альтернативного триггера

Если 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

NB Если вы только запускаете команду на одном из событий блокировки / разблокировки, просто закомментируйте соответствующую строку в разделе:

if lock2 != lock1: if lock2: # subprocess.Popen(lock_command) print("locked") else: # subprocess.Popen(unlock_command) print("unlocked")
3
ответ дан 24 July 2018 в 17:54
  • 1
    Это отличная идея, но она не сработала для меня :( Нет никакого диалога с gnome-screensaver. Я думаю, что это может быть - и это всего лишь теория - у ubuntu нет, по умолчанию, экранной заставки, и это У меня есть только экран входа в систему? Я попробую дома установить xscreensaver и использовать ваше решение, которое я нашел очень чистым и многоразовым. – eddieferetro 9 November 2017 в 17:47
  • 2
    @eddieferetro huh ?? Это странно, диалоговое окно заставки гномов, хотя название и так предлагает, не имеет ничего общего с заставкой, у меня нет скринсейвера. – Jacob Vlijm 9 November 2017 в 17:52
  • 3
    @eddieferetro вы могли бы запустить sleep 10 && pgrep -f gnome-screensaver, немедленно заблокировать экран, подождать 10-15 секунд, а затем снова разблокировать? Посмотрите, что такое выход? Ваш дистрибутив Gnome? (Ubuntu Gnome) – Jacob Vlijm 9 November 2017 в 17:55
  • 4
    Я не могу получить доступ к своему компьютеру отсюда (прокси). Я сделал то, что вы сказали вчера, и не показал никакого номера процесса ... :( Странно, я знаю, я схожу с ума от этого ... Мой дистрибутив - ubuntu 17.10, а рабочий стол - это ubuntu-gnome по умолчанию. .. Я повторю этот шаг, чтобы избежать возможности человеческой ошибки ... но я помню, что сам делал то, что вы говорите, и думал о съемке, потому что я знаю, что вы найдете его невероятным ... как я его нашел. .. – eddieferetro 9 November 2017 в 18:04
  • 5
    @eddieferetro Я установлю 17.10 / Gnome в виртуальной машине. Любопытно, что я увижу :) – Jacob Vlijm 9 November 2017 в 18:13

Другие вопросы по тегам:

Похожие вопросы: