Как запустить скрипт после резюме и после разблокирования экрана

В Ubuntu 12.04 LTS я хотел бы запустить скрипты после возобновления от, приостанавливают, и после разблокирования моего рабочего стола. Они должны работать как мой пользователь, и с доступом к моему $DISPLAY.

В частности, я хотел бы

  • перезапуск nm-applet работать вокруг ошибки 985028
  • покажите пользовательское использование уведомления notify-send
  • возможно другой материал, когда я получаю их работа

Когда я возобновляюсь, сценарии в /etc/pm/sleep.d/ выполняются, но они работают как корень без ведома моего экрана и имени пользователя. Это могло бы работать если я твердый код мое имя пользователя и export значение по умолчанию DISPLAY :0 в этих сценариях, но это чувствует себя подобно очень ужасному взлому.

Сценарии в ~/.config/autostart/xyz.desktop бегите за входом в систему, но они не бегут за простым разблокированием экрана после резюме.

Существует ли способ запустить скрипты после разблокирования экрана после резюме?

13
задан 7 January 2018 в 23:42

4 ответа

Одним решением является сценарий, который работает при вхождении в рабочий стол, и который ловит сообщения dbus. После резюме от приостанавливают экран, заблокирован, и после ввода пароля, на dbus существует событие Unlock.

(Благодаря Kim SJ для помещения меня на правильном пути. Я не имею никаких сигналов ScreenSaver, но нашел, что другой интерфейс использовал).

В ~/.config/autostart/, У меня есть .desktop файл, который запускает сценарий удара:

$ cat ~/.config/autostart/mymonitor.desktop
[Desktop Entry]
Categories=System;Monitor;
Comment=Monitor dbus for unlock signals
Exec=/usr/local/bin/unlock_monitor
Name=unlock_monitor
Type=Application

unlock_monitor сценарий монитора читает сообщения dbus из com.canonical.Unity.Session и действительно наполняет на Unlocked сигналы:

#!/bin/bash

dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session" --profile \
| while read dbusmsg; do
    if [[ "$dbusmsg" =~ Unlocked$ || "$dbusmsg" =~ NameAcquired$ ]] ; then
        sleep 5
        notify-send "$(basename $0)" "Unlocked or freshly logged in..."
        # ...
    fi
done

При входе в систему нет никакого "Разблокированного" сигнала, но существует сигнал "NameAcquired" когда dbus-monitor запускается.

0
ответ дан 7 January 2018 в 23:42

Похоже, что вы все равно должны жестко закодировать имя пользователя в предыдущем ответе, поэтому вот простой скрипт для /etc/pm/sleep.d, если кто-то ищет быстрое решение:

#!/bin/bash 
case "$1" in
    hibernate|suspend)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on suspend"
        ;;
    thaw|resume)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on resume"
        ;;
esac
0
ответ дан 7 January 2018 в 23:42

Вы можете запустить скрипт, используя start-stop-daemon. start-stop-daemon может разветвлять поток, работающий под разными uid и gid, что решает вашу проблему.

Вам нужно написать сценарий задания, помещенный в системную переменную PATH, например /usr/bin, и создать дополнительный сценарий демона в /etc/pm/sleep.d. Соответствуя действиям pm-suspend, таким как resume или thaw, скрипт демона фиксирует скрипт задания через

start-stop-daemon --start $ARGs --name nm-rtvt--exec /usr/bin/job_script

, где ARGs может быть --chuid 1001:1001 или просто --user your_username.

И для целостности, вы также можете захотеть, чтобы скрипт демона остановил дэймон с именем nm-rtvt перед приостановкой через

start-stop-daemon --stop <...>

, сопоставив pm-suspend такие действия, как suspend или hibernate. [ 1120]

Подробнее см. man start-stop-daemon. И есть много других примеров в /etc/init.d сценариев демона.

0
ответ дан 7 January 2018 в 23:42

Этот вопрос в Unix & amp; Сайт Linux описывает альтернативный подход с использованием сообщений dbus:

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean true" &> /dev/null; then SCREEN_LOCKED; elif echo $X | grep "boolean false" &> /dev/null; then SCREEN_UNLOCKED; fi done )

(замените SCREEN_LOCKED и SCREEN_UNLOCKED на действия, которые вы хотите выполнить.)

Использование xrandr 1>/dev/null 2>1 в качестве действия над Разблокировка исправила мою проблему, которая заключалась в том, что разрешения / позиции монитора не были правильно восстановлены при разблокировке экрана (xrandr, кажется, вызывает перечитывание настроек экрана). Я добавил эту строку в качестве фоновой задачи в свой файл .bash_profile (строго, он может быть лучше в качестве файла рабочего стола в ~ / .config / autostart, поскольку он запускается только при запуске gnome):

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean false" &> /dev/null; then xrandr 1>/dev/null 2>1; fi done ) &

Далее фон API gnome-screensaver можно найти на на этом сайте , а на мониторе dbus здесь .

0
ответ дан 7 January 2018 в 23:42

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

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