В Ubuntu 12.04 LTS я хотел бы запускать скрипты после возобновления с suspend и после разблокировки моего рабочего стола. Они должны работать как мой пользователь и с доступом к моему $DISPLAY.
В частности, я хотел бы
перезапустить nm-applet для обхода ошибки 985028 показать пользовательский уведомление, используя notify-send, возможно, другие вещи, когда я получаю эти рабочиеКогда я возобновляю, запускаются скрипты в /etc/pm/sleep.d/, но они выполняются как root, без знания моего экрана и имени пользователя. Это может сработать, если я жестко запрограммировал свое имя пользователя и export значение по умолчанию DISPLAY :0 в этих сценариях, но это кажется очень уродливым взломом.
Скрипты в ~/.config/autostart/xyz.desktop запускаются после входа в систему, но они не запускать после просто отпирания экрана после возобновления.
Есть ли способ запуска скриптов после разблокировки экрана после возобновления?
Похоже, вам все равно нужно жестко закодировать имя пользователя в предыдущем ответе, так что вот простой скрипт для /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 & 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 можно найти в . Этот вопрос в Unix & amp; Сайт Linux и на мониторе 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 сценариев демона.