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