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

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

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

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

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

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

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

4 ответа

Решение

Одним из решений является сценарий, который запускается при входе на рабочий стол и перехватывает сообщения 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

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

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

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

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

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