Come eseguire lo script dopo aver ripreso e dopo aver sbloccato la schermata


13

In Ubuntu 12.04 LTS, vorrei eseguire script dopo aver ripreso dalla sospensione e dopo aver sbloccato il desktop. Questi devono essere eseguiti come mio utente e con accesso al mio $DISPLAY.

In particolare, vorrei

  • riavviare nm-appletper aggirare il bug 985028
  • mostra una notifica personalizzata utilizzando notify-send
  • forse altre cose quando le faccio funzionare

Quando riprendo, gli script in /etc/pm/sleep.d/vengono eseguiti, ma vengono eseguiti come root, senza conoscere il mio schermo e il mio nome utente. Potrebbe funzionare se codifico il mio nome utente e exportil valore predefinito DISPLAY :0in questi script, ma mi sembra un brutto hack.

Gli script vengono ~/.config/autostart/xyz.desktopeseguiti dopo l'accesso, ma non vengono eseguiti dopo aver semplicemente sbloccato lo schermo dopo il ripristino.

C'è un modo per eseguire script dopo aver sbloccato lo schermo dopo un curriculum?


Per non codificare il nome utente, è possibile utilizzare users, supponendo che nessun altro abbia effettuato l'accesso. (O non importa)
Sparhawk

Risposte:


9

Sembra che tu debba comunque codificare il nome utente nella risposta precedente, quindi ecco un semplice script per in /etc/pm/sleep.d se qualcuno sta cercando una soluzione rapida:

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

5

Questa domanda sul sito Unix e Linux documenta un approccio alternativo usando i messaggi 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 )

(Sostituisci SCREEN_LOCKED e SCREEN_UNLOCKED con le azioni che desideri eseguire.)

L'uso xrandr 1>/dev/null 2>1dell'azione sullo sblocco ha risolto il mio problema che le risoluzioni / posizioni del monitor non venivano ripristinate correttamente sullo sblocco dello schermo (xrandr sembra causare una rilettura delle impostazioni dello schermo). Ho aggiunto questa riga come attività in background nel mio .bash_profile (potrebbe essere meglio come file desktop in ~ / .config / autostart, poiché funziona solo quando avvii 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 ) &

Ulteriori informazioni sull'API di gnome-screensaver sono disponibili in questo sito e sul monitor dbus qui .


1

Una soluzione è uno script che viene eseguito quando si accede al desktop e che rileva i messaggi dbus. Dopo aver ripreso dalla sospensione lo schermo è bloccato e dopo aver inserito la password, c'è un evento di sblocco su dbus.

(Grazie a Kim SJ per avermi messo sulla strada giusta. Non ho segnali ScreenSaver, ma ho trovato un'altra interfaccia da usare).

In ~/.config/autostart/, ho un file .desktop che avvia uno script 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

Lo unlock_monitorscript monitor legge i messaggi dbus com.canonical.Unity.Sessione fa cose sui Unlockedsegnali:

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

Quando si accede, non c'è alcun segnale "Unlocked", ma c'è un segnale "NameAcquired" all'avvio dbus-monitor.


0

Puoi eseguire uno script usando start-stop-daemon. start-stop-daemon può eseguire il fork del thread in esecuzione come uid e gid diversi, risolvendo quindi il problema.

Quello che devi fare è scrivere uno script di lavoro inserito nel sistema PATH come /usr/bin, e creare uno script daemon aggiuntivo in /etc/pm/sleep.d. L' pm-suspendazione corrispondente come resumeo thawlo script daemon commette lo script lavoro tramite

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

dove ARGspotrebbe essere --chuid 1001:1001o solo --user your_username.

E per integrità, potresti anche voler che lo script del demone fermi il damon nominato nm-rtvtprima di sospenderlo

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

pm-suspendazioni corrispondenti come suspendo hibernate.

Per i dettagli, man start-stop-daemon. E ci sono molti altri esempi /etc/init.ddi script daemon.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.