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

13

Dans Ubuntu 12.04 LTS, je voudrais exécuter des scripts après la reprise de la suspension et après avoir déverrouillé mon bureau. Ceux-ci doivent être exécutés en tant qu'utilisateur et avoir accès à mon $DISPLAY.

En particulier, je voudrais

  • redémarrer nm-appletpour contourner le bogue 985028
  • afficher une notification personnalisée à l'aide notify-send
  • éventuellement d'autres choses quand je les fais travailler

Lorsque je reprends, les scripts /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 exportla valeur DISPLAY :0par défaut dans ces scripts, mais cela ressemble à un hack très laid.

Les scripts sont ~/.config/autostart/xyz.desktopexécutés après la connexion, mais ils ne s'exécutent pas après avoir simplement déverrouillé 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 un CV?

mivk
la source
Pour ne pas coder en dur le nom d'utilisateur, vous pouvez utiliser users, en supposant que personne d'autre n'est connecté. (Ou cela n'a pas d'importance)
Sparhawk

Réponses:

9

Il semble que vous devez coder en dur le nom d'utilisateur dans la réponse précédente, alors voici un script simple pour /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
aaron-bru
la source
5

Cette question sur le site Unix et Linux décrit 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 xrandr 1>/dev/null 2>1de l'action sur le déverrouillage a résolu mon problème selon lequel 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 d'arrière-plan dans mon .bash_profile (strictement, cela pourrait être mieux comme fichier de bureau dans ~ / .config / autostart, car 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 ) &

De plus amples informations sur l'API gnome-screensaver peuvent être trouvées sur ce site , et sur le moniteur dbus ici .

Kim SJ
la source
1

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

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

Dans ~/.config/autostart/, j'ai un fichier .desktop qui démarre 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 unlock_monitorscript de contrôle lit les messages dbus com.canonical.Unity.Sessionet fait des trucs sur les Unlockedsignaux:

#!/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 y a un signal "NameAcquired" au dbus-monitordémarrage.

mivk
la source
0

Vous pouvez exécuter un script en utilisant le démon start-stop. start-stop-daemon peut bifurquer le thread en cours d'exécution sous différents uid et gid, résolvant ainsi votre problème.

Ce que vous devez faire est d'écrire un script de travail placé dans le système comme PATH /usr/binet de créer un script démon supplémentaire dans /etc/pm/sleep.d. L' pm-suspendaction correspondante comme resumeou thawle script démon valide le script de travail via

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

ARGspourrait être --chuid 1001:1001ou tout simplement --user your_username.

Et pour l'intégrité, vous pourriez aussi bien vouloir que le script démon arrête le damon nommé nm-rtvtavant de suspendre via

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

pm-suspendactions correspondantes comme suspendou hibernate.

Pour plus de détails, man start-stop-daemon. Et il existe de nombreux autres exemples /etc/init.dde scripts de démon.

funicorne
la source