Jak uruchomić skrypt po wznowieniu i po odblokowaniu ekranu

14

W systemie Ubuntu 12.04 LTS chciałbym uruchamiać skrypty po wznowieniu zawieszenia i odblokowaniu pulpitu. Muszą one działać jako mój użytkownik z dostępem do mojego $DISPLAY.

W szczególności chciałbym

  • uruchom ponownie, nm-appletaby obejść błąd 985028
  • pokaż niestandardowe powiadomienie za pomocą notify-send
  • ewentualnie inne rzeczy, kiedy zacznę działać

Po wznowieniu /etc/pm/sleep.d/uruchamiane są skrypty , ale działają one jako root, bez znajomości mojego ekranu i nazwy użytkownika. Może to działać, jeśli na stałe exportwpisuję DISPLAY :0w swoich skryptach swoją nazwę użytkownika i domyślną , ale wydaje mi się to bardzo brzydkim włamaniem.

Skrypty ~/.config/autostart/xyz.desktopdziałają po zalogowaniu, ale nie uruchamiają się po odblokowaniu ekranu po wznowieniu.

Czy istnieje sposób uruchamiania skryptów po odblokowaniu ekranu po wznowieniu?

mivk
źródło
Aby nie kodować nazwy użytkownika, możesz użyć users, zakładając, że nikt inny nie jest zalogowany. (Lub to nie ma znaczenia)
Sparhawk

Odpowiedzi:

9

Wygląda na to, że i tak musisz zakodować nazwę użytkownika w poprzedniej odpowiedzi, więc oto prosty skrypt dla /etc/pm/sleep.d, jeśli ktoś szuka szybkiej poprawki:

#!/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
aaron-bru
źródło
6

To pytanie w witrynie Unix i Linux dokumentuje alternatywne podejście z wykorzystaniem komunikatów 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 )

(Zastąp SCREEN_LOCKED i SCREEN_UNLOCKED czynnościami, które chcesz wykonać.)

Używanie xrandr 1>/dev/null 2>1jako akcji odblokowania naprawiło mój problem polegający na tym, że rozdzielczości / pozycje monitora nie były poprawnie przywracane podczas odblokowywania ekranu (xrandr wydaje się powodować ponowne czytanie ustawień ekranu). Dodałem tę linię jako zadanie w tle do mojego .bash_profile (ściśle może być lepiej jako plik na pulpicie w ~ / .config / autostart, ponieważ działa to tylko po uruchomieniu 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 ) &

Dalsze informacje na temat interfejsu API wygaszacza ekranu można znaleźć na tej stronie oraz tutaj na monitorze dbus .

Kim SJ
źródło
1

Jednym z rozwiązań jest skrypt uruchamiany podczas logowania do pulpitu i wychwytujący komunikaty dbus. Po wznowieniu zawieszenia ekran jest zablokowany, a po wprowadzeniu hasła w dbus następuje zdarzenie Odblokuj.

(Dzięki Kim SJ za umieszczenie mnie na właściwej ścieżce. Nie mam sygnałów ScreenSaver, ale znalazłem inny interfejs do użycia).

W ~/.config/autostart/mam plik .desktop, który uruchamia skrypt 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_monitorSkrypt Monitor odczytuje wiadomości z DBus com.canonical.Unity.Sessioni robi rzeczy na Unlockedsygnały:

#!/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

Podczas logowania nie ma sygnału „Odblokowany”, ale po uruchomieniu pojawia się sygnał „NameAcquired” dbus-monitor.

mivk
źródło
0

Możesz uruchomić skrypt za pomocą start-stop-daemon. start-stop-daemon może rozwidlać wątek działający jako inny identyfikator UID i GID, co rozwiąże Twój problem.

Musisz napisać skrypt zadania umieszczony w systemie PATH jak /usr/bini utworzyć dodatkowy skrypt demona /etc/pm/sleep.d. Dopasowanie pm-suspendakcji typu resumelub thawskrypt demona zatwierdza skrypt zadania za pośrednictwem

start-stop-daemon --start $ARGs --name nm-rtvt--exec /usr/bin/job_script

gdzie ARGsmoże być --chuid 1001:1001lub po prostu --user your_username.

I dla uczciwości, równie dobrze możesz chcieć, aby skrypt demona zatrzymał damona nazwanego nm-rtvtprzed zawieszeniem za pośrednictwem

start-stop-daemon --stop <...>

pasujące pm-suspenddziałania, takie jak suspendlub hibernate.

Szczegółowe informacje man start-stop-daemon. Istnieje wiele innych przykładów /etc/init.dskryptów demonów.

funicorn
źródło