web-dev-qa-db-fra.com

Comment exécuter le script après la reprise et après le déverrouillage de l'écran

Dans Ubuntu 12.04 LTS, je voudrais exécuter des scripts après la reprise de la suspension et le déverrouillage de mon bureau. Celles-ci doivent fonctionner en tant qu'utilisateur et avec accès à mon $DISPLAY.

En particulier, je voudrais

  • redémarrez nm-applet pour contourner le problème bogue 985028
  • afficher une notification personnalisée à l'aide de notify-send
  • éventuellement d'autres trucs quand je travaille ces

Lorsque je reprends, les scripts de /etc/pm/sleep.d/ sont exécutés, mais ils s'exécutent en tant que root, sans connaître mon écran et mon nom d'utilisateur. Cela pourrait fonctionner si je codais en dur mon nom d'utilisateur et export la valeur par défaut DISPLAY :0 dans ces scripts, mais cela ressemble à un très mauvais bidouillage.

Les scripts dans ~/.config/autostart/xyz.desktop s'exécutent après la connexion, mais ils ne s'exécutent pas uniquement après le déverrouillage de l'écran après la reprise.

Existe-t-il un moyen d'exécuter des scripts après avoir déverrouillé l'écran après une reprise?

13
mivk

Une solution est un script qui s'exécute lors de la connexion au bureau et qui intercepte les messages Dbus. Après la reprise de la suspension, l'écran est verrouillé et, après la saisie du mot de passe, il existe un événement de déverrouillage sur dbus.

(Merci à Kim SJ de m'avoir mis sur la bonne voie. Je n'ai aucun signal ScreenSaver, mais j'ai trouvé une autre interface à utiliser).

Dans ~/.config/autostart/, j'ai un fichier .desktop qui lance 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

Le script de moniteur unlock_monitor lit les messages dbus de com.canonical.Unity.Session et fait des trucs sur Unlocked signale:

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

Lors de la connexion, il n'y a pas de signal "Déverrouillé", mais il existe un signal "NomAcquis" lorsque dbus-monitor démarre.

0
mivk

De toute façon, il semble que vous deviez coder en dur le nom d'utilisateur dans la réponse précédente. Voici donc un script simple pour dans /etc/pm/sleep.d si quelqu'un cherche une solution rapide:

#!/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
9
aaron-bru

Cette question sur le site Unix et Linux documente une approche alternative utilisant des messages 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 )

(Remplacez SCREEN_LOCKED et SCREEN_UNLOCKED par les actions que vous souhaitez effectuer.)

L'utilisation de xrandr 1>/dev/null 2>1 comme action de déverrouillage a résolu le problème suivant: les résolutions/positions du moniteur n'étaient pas correctement restaurées lors du déverrouillage de l'écran (xrandr semble provoquer une relecture des paramètres de l'écran). J'ai ajouté cette ligne comme tâche en arrière-plan dans mon fichier .bash_profile (strictement, cela pourrait être mieux comme fichier de bureau dans ~/.config/autostart, puisque cela ne fonctionne que lorsque vous démarrez 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 ) &

Vous trouverez plus d'informations sur l'API gnome-screensaver à l'adresse suivante: ce site , et sur le moniteur dbus ici .

4
Kim SJ

Vous pouvez exécuter un script à l'aide de start-stop-daemon. start-stop-daemon peut créer un thread qui s'exécute avec des identifiants différents (uid et gid), ce qui résout votre problème.

Ce que vous devez faire est d'écrire un script de travail placé dans PATH du système, comme /usr/bin, et de créer un script démon supplémentaire dans /etc/pm/sleep.d. Action correspondante pm-suspend comme resume ou thaw le script démon valide le script de travail via

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

ARGs pourrait être --chuid 1001:1001 ou simplement --user your_username.

Et pour des raisons d’intégrité, vous pouvez également souhaiter que le script démon arrête le damon nommé nm-rtvt avant d’interrompre via

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

correspondant à pm-suspend actions telles que suspend ou hibernate.

Pour plus de détails, man start-stop-daemon. Et il y a beaucoup d'autres exemples dans /etc/init.d de scripts de démon.

0
funicorn