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
nm-applet
pour contourner le problème bogue 985028notify-send
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?
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.
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
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 .
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
où 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.