Cómo ejecutar el script después de reanudar y después de desbloquear la pantalla

13

En Ubuntu 12.04 LTS, me gustaría ejecutar scripts después de reanudar la suspensión y después de desbloquear mi escritorio. Estos deben ejecutarse como mi usuario y con acceso a mi $DISPLAY.

En particular, me gustaría

  • reiniciar nm-appletpara evitar el error 985028
  • mostrar una notificación personalizada usando notify-send
  • posiblemente otras cosas cuando empiece a funcionar

Cuando reanudo, los scripts /etc/pm/sleep.d/se ejecutan, pero se ejecutan como root, sin conocer mi pantalla y nombre de usuario. Podría funcionar si codifico mi nombre de usuario y exportel valor predeterminado DISPLAY :0en estos scripts, pero eso se siente como un truco muy feo.

Scripts en ~/.config/autostart/xyz.desktopejecución después de iniciar sesión, pero no se ejecutan después de simplemente desbloquear la pantalla después de reanudar.

¿Hay alguna manera de ejecutar scripts después de desbloquear la pantalla después de un currículum?

mivk
fuente
Para no codificar el nombre de usuario, puede usarlo users, suponiendo que nadie más haya iniciado sesión. (O no importa)
Sparhawk

Respuestas:

9

Parece que de todos modos tiene que codificar el nombre de usuario en la respuesta anterior, así que aquí hay un script simple para /etc/pm/sleep.d si alguien está buscando una solución rápida:

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

Esta pregunta en el sitio de Unix y Linux documenta un enfoque alternativo utilizando mensajes 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 )

(Reemplace SCREEN_LOCKED y SCREEN_UNLOCKED con las acciones que desea realizar).

El uso de xrandr 1>/dev/null 2>1la acción de desbloqueo solucionó mi problema de que las resoluciones / posiciones del monitor no se restauraban correctamente al desbloquear la pantalla (xrandr parece causar una nueva lectura de la configuración de la pantalla). Agregué esta línea como una tarea en segundo plano en mi .bash_profile (estrictamente podría ser mejor como un archivo de escritorio en ~ / .config / autostart, ya que eso solo se ejecuta cuando inicia 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 ) &

Puede encontrar más información sobre la API de gnome-screensaver en este sitio y en el monitor dbus aquí .

Kim SJ
fuente
1

Una solución es un script que se ejecuta al iniciar sesión en el escritorio y que capta los mensajes dbus. Después de reanudar la suspensión, la pantalla se bloquea y luego de ingresar la contraseña, hay un evento de desbloqueo en dbus.

(Gracias a Kim SJ por ponerme en el camino correcto. No tengo señales de ScreenSaver, pero encontré otra interfaz para usar).

En ~/.config/autostart/, tengo un archivo .desktop que inicia un 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

La unlock_monitorsecuencia de comandos del monitor lee los mensajes de dbus com.canonical.Unity.Sessiony hace cosas en las Unlockedseñales:

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

Al iniciar sesión, no hay señal de "Desbloqueado", pero hay una señal de "Nombre adquirido" cuando se dbus-monitorinicia.

mivk
fuente
0

Puede ejecutar un script usando start-stop-daemon. start-stop-daemon puede bifurcar el hilo ejecutándose como uid y gid diferentes, resolviendo así su problema.

Lo que debe hacer es escribir un script de trabajo colocado en la RUTA del sistema como /usr/bin, y crear un script de demonio adicional en /etc/pm/sleep.d. pm-suspendAcción coincidente como resumeo thawel script daemon confirma el script de trabajo a través de

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

donde ARGspodría ser --chuid 1001:1001o simplemente --user your_username.

Y para mayor integridad, es posible que también desee que el script daemon detenga el damon nombrado nm-rtvtantes de suspenderlo a través de

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

pm-suspendacciones coincidentes como suspendo hibernate.

Para más detalles man start-stop-daemon,. Y hay muchos otros ejemplos /etc/init.dde scripts de daemon.

funicornio
fuente