Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/11/2010, à 20:35

Gilless

Executer un script lors du changement d'alimentation

Bonjour,

J'aimerais executer un script lorsque l'ordinateur passe du mode batterie au mode secteur ou inversement. J'ai deja essaye de placer le script dans /etc/pm/power.d/ ou /usr/lib/pm-utils/power.d/ en le rendant executable mais cela n'a pas fonctionné.
Comment puis-je faire ?

Merci par avance smile

Hors ligne

#2 Le 14/11/2010, à 22:10

chopinhauer

Re : Executer un script lors du changement d'alimentation

Il est censé faire quoi le script ? À mon avis il est lancé, mais il échoue. Tu peux le vérifier en rédirectionnant la sortie d'erreur standard vers un fichier ('exec 2>/chemin/fichier').


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#3 Le 14/11/2010, à 23:25

Gilless

Re : Executer un script lors du changement d'alimentation

Pour l'instant ce script ne fais rien je test son execution en lançant "gedit" :

#!/bin/bash
# Version du script
gedit
exit 0;

Lorsque je le lance à partir de la console cela fonctionne mais si je débranche/rebranche l'alim rien... Faut-il redémarrer après avoir ajouté le fichier (rendu executable) ?

Ou dois-je placer 'exec 2>/chemin/fichier' pour tester ? dans mon script ou dans un terminal avant ?

Hors ligne

#4 Le 14/11/2010, à 23:44

chopinhauer

Re : Executer un script lors du changement d'alimentation

Gilless a écrit :

Lorsque je le lance à partir de la console cela fonctionne mais si je débranche/rebranche l'alim rien... Faut-il redémarrer après avoir ajouté le fichier (rendu executable) ?

Ubuntu n'as pas un unique affichage graphique comme Windows, donc il faut spécifier lequel on souhaite utiliser. Cela se fait avec des variables d'environnement (que tu peux lister avec la commande env), dont DISPLAY spécifie l'affichage à utiliser. Remplace gedit par :

export DISPLAY=:0.0
sudo -u <ton_utilisateur> gedit

avec à la place de <ton_utilisateur> ton nom utilisateur.

Gilless a écrit :

Ou dois-je placer 'exec 2>/chemin/fichier' pour tester ? dans mon script ou dans un terminal avant ?

Au début du script avec à la place de /chemin/fichier par exemple /home/<ton_utilisateur>/debug.txt.


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#5 Le 15/11/2010, à 22:06

Gilless

Re : Executer un script lors du changement d'alimentation

Merci. Cela fonctionne bien avec gedit (qui n'était comme dit qu'un test).
Cepenandant dès que je passe au vrai script que je souhaite executer cela ne donne rien :

sudo -u gilles gconftool-2 --type string --set /desktop/gnome/background/picture_filename_ac /usr/share/backgrounds/Spiral_by_firas.jpg

Même lorsque je l'execute dans un terminal il n'y a pas d'erreur mais aucun changement n'est visible, la clé  /desktop/gnome/background/picture_filename_ac gardesa valeur.

Lorsque j'enlève sudo -u gilles cela fonctionne dans un terminal mais toujours pas lorsque le script s'execute lors d'un changement d'alimentation...

J'ai du mal à comprendre et à immaginer le problème.

Hors ligne

#6 Le 15/11/2010, à 23:00

chopinhauer

Re : Executer un script lors du changement d'alimentation

La clé picture_filename_ac n'existe pas vraiment et Google semble me donner raison. Celle qui choisit le fond d'écran est picture_filename.

Vu que ton script n'utilise pas l'affichage graphique, la variable DISPLAY n'est pas nécessaire. Par contre il a besoin de pouvoir contacter le serveur de configuration GConf et donc avoir l'adresse du bus D-Bus (qui s'occupe de la communication entre processus dans GNOME). Mets au début de ton script :

source /home/gilles/.dbus/session-bus/*-0
export DBUS_SESSION_BUS_ADDRESS

En théorie si une application connait le numéro de serveur d'affichage X à utiliser, elle devrait pouvoir trouver l'adresse du bus D-Bus associé, mais apparemment pour gconftool-2 ce n'est pas comme cela.


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#7 Le 15/11/2010, à 23:31

Gilless

Re : Executer un script lors du changement d'alimentation

Merci de tes réponses smile
Cela n'a rien changé de perceptible.
Je me suis douté que DISPLAY n'était pas util.

A ce stade je pense qu'il est plus simple que j'explique clairement ce que j'essaye de faire :

J'aimerais que le fond d'écran change selon le mode d'alimentation (AC ou Batterie).
J'ai créé deux clés : picture_filename_ac et picture_filename_batterie pour stocker le chemin de cahque fond d'écran. Afin de pouvoir changer de fond d'écran et avec le gestionnaire habituel je compare le fond d'écran en place en cas de changement d'alimentation et si il n'est pas celui enregistré alors je remplace celui enregistré avant de mettre l'autre correspondant a l'alimentation actuelle.

le script est le suivant :

#!/bin/bash

BG=`gconftool-2 --get /desktop/gnome/background/picture_filename`
BG_AC=`gconftool-2 --get /desktop/gnome/background/picture_filename_ac`
BG_BATTERY=`gconftool-2 --get /desktop/gnome/background/picture_filename_battery`

echo $BG
echo $BG_AC
echo $BG_BATTERY

if on_ac_power; then
       echo "ac"
    if [ "$BG" != "$BG_AC" ]; then
        {
        echo "BG!=BG_AC"
        gconftool-2 --type string --set /desktop/gnome/background/picture_filename_battery $BG

        gconftool-2 --type string --set /desktop/gnome/background/picture_filename $BG_AC
        }
    fi
else
       echo "battery"
    if [ "$BG" != "$BG_BATTERY" ]; then
        {
        echo "BG!=BG_BATTERY"
        gconftool-2 --type string --set /desktop/gnome/background/picture_filename_ac $BG

        gconftool-2 --type string --set /desktop/gnome/background/picture_filename $BG_BATTERY
        }
    fi
fi

exit 0;

Il y a encore des echo un peu partout pour avoir un retour lorsque je teste dans le terminal. Justement cette versino fonctionne bien dans un terminal mais pas en conditions réelles lorsque le script est dans /etc/pm/power.d/ et executable.

Ceci lance bel et bien gedit lorsque je change de mode d'alimentation :

export DISPLAY=:0.0
sudo -u gilles gedit

A noter aussi que lorsque je fais :

sudo -u gilles gconftool-2 --type string --set /desktop/gnome/background/picture_filename_ac $BG

cela ne fonctionne pas (même dans un terminal) mais :

BG=`sudo -u gilles gconftool-2 --get /desktop/gnome/background/picture_filename`

donne bien le résultat (dans un terminal)

Jai également déja essayé de placer le tout à la suite d'un exec` sans succès.
Une idée ?

Hors ligne

#8 Le 15/11/2010, à 23:54

chopinhauer

Re : Executer un script lors du changement d'alimentation

Je ferais quelque chose comme :

#!/bin/bash
USER=gilles
HOME=/home/$USER

exec 2>$HOME/stderr.txt
exec >$HOME/stdout.txt

source $HOME/.dbus/session-bus/*-0
export DBUS_SESSION_BUS_ADDRESS

if on_ac_power; then
    key="/desktop/gnome/background/picture_filename_ac"
else
    key="/desktop/gnome/background/picture_filename_battery"
fi

value=`sudo -EHu $USER gconftool-2 --get $key`
sudo -EHu $USER gconftool-2 --set /desktop/gnome/background/picture_filename -t string "$value"

Les deux options '-E' et '-H' de sudo signifient respectivement : laisse l'environnement comme il est (en particulier n'efface pas la variable DBUS_SESSION_BUS_ADDRESS qu'on a introduit) et change la variable HOME vers le dossier personnel de l'utilisateur.

Tu peux mettre des echo et t'obtiendras la sortie standard de ton script dans stdout.txt et les erreurs dans stderr.txt.

PS : Le inconsistances dont tu fais expériences dépendent du fait que parfois gconftool-2 contacte le serveur gconfd, d'autres fois il lit directement la configuration. Seulement en contactant le serveur gconfd le réglage peut être pris en compte immédiatement. Pour tester les deux cas, fais un :

gconftool-2 --ping; echo $?

la valeur 0 signifie que le serveur a été contacté, la valeur 2 qu'il n'est pas là.

Dernière modification par chopinhauer (Le 16/11/2010, à 00:07)


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#9 Le 16/11/2010, à 20:24

Gilless

Re : Executer un script lors du changement d'alimentation

Whoa ! Chapeau !
Ca marche nickel smile
J'ai rajouté qqes lignes pour sauvegarder le fond d'écran actuel avant de changer.

J'ai pas compris l'histoire de bus D-Bus.

Le code est un peu moins propre mais ça fonctionne pile comme je le voulais :

#!/bin/bash
USER=gilles
HOME=/home/$USER

exec 2>$HOME/stderr.txt
exec >$HOME/stdout.txt

source $HOME/.dbus/session-bus/*-0
export DBUS_SESSION_BUS_ADDRESS

ovalue=`sudo -EHu $USER gconftool-2 --get "/desktop/gnome/background/picture_filename"`

if on_ac_power; then
    key="/desktop/gnome/background/picture_filename_ac"
    sudo -EHu $USER gconftool-2 --set /desktop/gnome/background/picture_filename_battery -t string "$ovalue"
else
    key="/desktop/gnome/background/picture_filename_battery"
    sudo -EHu $USER gconftool-2 --set /desktop/gnome/background/picture_filename_ac -t string "$ovalue"
fi

value=`sudo -EHu $USER gconftool-2 --get $key`
sudo -EHu $USER gconftool-2 --set /desktop/gnome/background/picture_filename -t string "$value"

Merci beaucoup !

Hors ligne

#10 Le 16/11/2010, à 21:12

chopinhauer

Re : Executer un script lors du changement d'alimentation

Les exec te servent uniquement pour le débogage. Enlève les quand cela marche. Tu peux aussi raccourcir ton script avec :

# Passage de secteur à batterie
oldkey="/desktop/gnome/background/picture_filename_ac"
key="/desktop/gnome/background/picture_filename_battery"
# Passage inverse ?
if on_ac_power; then
    tmp=$oldkey; oldkey=$key; key=$tmp;
fi
# Récupérer l'ancien fond d'écran et le nouveau
oldvalue=`sudo -EHu $USER gconftool-2 --get /desktop/gnome/background/picture_filename`
value=`sudo -EHu $USER gconftool-2 --get $key`
# Sauvegarder l'ancien fond d'écran et mettre le nouveau
sudo -EHu $USER gconftool-2 --set $oldkey -t string "$oldvalue"
sudo -EHu $USER gconftool-2 --set /desktop/gnome/background/picture_filename -t string "$value"

et le poster dans astuces. La batterie de mon portable est cassée, donc j'ai d'autres manières pour m'apercevoir si le portable n'est pas sur le secteur smile. Cependant cela pourrait intéresser d'autres gens.

Pour D-Bus : un navigateur Web communique avec un serveur en utilisant HTTP (et Internet de manière plus générale). De la même manière deux applications sur la même machine ont aussi besoin de communiquer (et il y a plein de manières différentes). Et pour communiquer le "client" (celle qui appelle) a besoin de connaître l'adresse du "serveur".

Pour une application graphique par exemple, l'adresse du serveur X à contacter a la forme <machine>:<numéro serveur>.<écran> et est lu d'habitude dans la variable DISPLAY. Vu que <machine> est d'habitude la même machine et le serveur a un seul écran, on peut le omettre ce qui résulte dans l'adresse :0.

Pour communiquer entre applications les nouvelles applications GNOME (et KDE) utilisent D-Bus comme protocole de communication. D-Bus rassemble un réseau local où chaque application a une adresse. Celle importantes (comme le serveur de configuration GConf) ont une adresse fixe, mais reste le problème de choisir le réseau D-Bus pour se connecter : chaque utilisateur a un bus D-Bus (en local les réseaux s'appellent souvent bus, comme bus PCI-Express par exemple), et même un bus par session, et il y a aussi un bus système pour les applications d'intérêt général.

Du coup l'application a besoin de connaître l'adresse du bus. La plupart des applications sait trouver cette adresse en demandant au serveur X l'adresse du bus pour l'utilisateur connecté au serveur (sur ma 10.10 seulement un utilisateur est autorisé à se connecter), mais d'autres ne savent pas le faire et ont besoin de la variable DBUS_SESSION_BUS_ADDRESS.

De toute manière GConf est en train d'être décommissionné, donc ce manque de la part de gconftool-2 n'est bien pas grave. En plus il n'utilisait pas D-Bus au départ, mais Gnorba, ce qui lui donne une autre excuse.

Dernière modification par chopinhauer (Le 16/11/2010, à 21:20)


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#11 Le 29/11/2010, à 00:24

Gilless

Re : Executer un script lors du changement d'alimentation

Le script n'est pas encore fonctionnel. Je n'ai pas eu le temps d'en faire les modifications proposées depuis la dernière fois. Je vais le reprendre quand j'en aurais le temps.
Merci encore pour ces informations !
smile

Hors ligne