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