Як запустити скрипт після резюме та після розблокування екрана


14

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

Зокрема, хотілося б

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

Коли я поновлюсь, сценарії /etc/pm/sleep.d/запущені, але вони запускаються як root, не знаючи екрана та імені користувача. Це може спрацювати, якщо я жорстко кодую своє ім’я користувача та exportза замовчуванням DISPLAY :0у цих сценаріях.

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

Чи є спосіб запустити сценарії після розблокування екрана після резюме?


Щоб не жорстко users
кодувати

Відповіді:


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

6

Це запитання на сайті 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 можна знайти на цьому веб-сайті та на моніторі dbus тут .


1

Одне рішення - це скрипт, який запускається при вході на робочий стіл і який перехоплює dbus-повідомлення. Після відновлення призупинення екран блокується, а після введення пароля на dbus відбувається подія Unlock.

(Дякую Кім 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

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


0

Ви можете запустити сценарій, використовуючи старт-стоп-демон. start-stop-демон може пришвидшити нитку, що працює, як різні 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сценаріях демонів є багато інших прикладів .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.