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

13

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

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

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

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

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

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

mivk
источник
Чтобы не жестко кодировать имя пользователя, вы можете использовать его users, предполагая, что никто не вошел в систему. (Или это не имеет значения)
Sparhawk

Ответы:

9

Похоже, что вы все равно должны жестко кодировать имя пользователя в предыдущем ответе, поэтому вот простой скрипт для /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
Арон-BRU
источник
5

Этот вопрос на сайте Unix & 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 здесь .

Ким С.Дж.
источник
1

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

(Спасибо Kim SJ за то, что поставили меня на правильный путь. У меня нет сигналов ScreenSaver, но я нашел другой интерфейс для использования).

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

$ 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

При входе в систему отсутствует сигнал «Unlocked», но при dbus-monitorзапуске появляется сигнал «NameAcquired» .

mivk
источник
0

Вы можете запустить скрипт, используя 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 .

Для деталей man start-stop-daemon. И есть много других примеров в /etc/init.dскриптах демонов.

funicorn
источник