Une place pour une véritable innovation. Partagez vos propres utilitaires créés avec la communauté Manjaro.
Questions et discussions sur la programmation et le codage.
Répondre

Affichage et crontab : DISPLAY & DBUS_SESSION_BUS_ADDRESS

#1Messageil y a 1 an

Bonjour,

Tout d'abord, je ne suis pas certain que ce soit une question spécifique à Xfce, donc n'hésitez pas à déplacer mon post si nécessaire.

J'ai fais un petit script maison pour désactiver la mise en veille de l'écran et/ou de l'ordinateur en fonction de quelques conditions (du son est joué, position de la souris, application au premier plan...). Mon script n'est sans doute pas parfait mais il répond à mes besoins. À priori, il fonctionne bien lorsque je le lance manuellement dans un terminal mais pas lorsqu'il est exécuté par cron... Pourquoi ?

Ma seule hypothèse est qu'il est nécessaire de spécifier l'affichage à utiliser via export DISPLAY=:0. Mais sans succès. Sans doute je ne fais pas ça correctement puisque la tâche cron suivante ne fonctionne pas non plus alors qu'elle le devrait il me semble :

* *    * * *    export DISPLAY=:0 && notify-send -t 60000 'Notification' 'Test'


Quelqu'un a-t-il une solution pour résoudre ce problème avec cron ? L'hypothèse de DISPLAY vous semble-t-elle correcte ? J'ai manqué quelque chose d'autre ?

Pour les curieux, voilà mon script. N'hésitez bien sûr pas à vous en inspirer et/ou apporter quelques améliorations (je ne suis pas un expert) :

#!/bin/sh

## Définition des profiles :

# Profile0 = Extinction de l'écran et mise en veille de l'ordinateur après des durées définies.
Profile0() {

   # Extinction de l'écran
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/dpms-enabled --set true

   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/blank-on-battery --set 4
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/blank-on-ac --set 4

   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/dpms-on-battery-sleep --set 5
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/dpms-on-ac-sleep --set 5

   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/brightness-on-battery --set 120
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/brightness-on-ac --set 120

   # Mise en veille de l'ordinateur
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/inactivity-on-battery --set 15
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/inactivity-on-ac --set 15
}

# Profile 1 = Pas d'extinction de l'écran ni de mise en veille de l'ordinateur (aka regarder un film/vidéo/diaporama)
Profile1()
{
   # Pas d'extinction de l'écran
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/dpms-enabled --set false

   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/blank-on-battery --set 0
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/blank-on-ac --set 0

   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/dpms-on-battery-sleep --set 0
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/dpms-on-ac-sleep --set 0

   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/brightness-on-battery --set 0
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/brightness-on-ac --set 0
      
   # Pas de mise en veille de l'ordinateur
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/inactivity-on-battery --set 0
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/inactivity-on-ac --set 0
   exit
}

# Profile 2 = Mise en veille de l'écran mais pas de mise en veille de l'ordinateur (aka écouter de la musique/radio/podcast)
Profile2()
{
   # Extinction de l'écran
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/dpms-enabled --set true

   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/blank-on-battery --set 4
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/blank-on-ac --set 4

   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/dpms-on-battery-sleep --set 5
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/dpms-on-ac-sleep --set 5

   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/brightness-on-battery --set 120
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/brightness-on-ac --set 120
      
   # Pas de mise en veille de l'ordinateur
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/inactivity-on-battery --set 0
   xfconf-query --channel xfce4-power-manager --property /xfce4-power-manager/inactivity-on-ac --set 0
   exit
}


## Conditions du Profile1:

# Si le curseur de la souris est dans l'angle en haut à droite
eval $(xdotool getmouselocation --shell) && if [[ $X -ge 1919 && $Y -eq 0 ]]; then Profile1; fi;

# Si l'un des ces termes apparait dans le titre de la fenêtre au premier plan
progs=('popcorn' 'kodi' 'vlc' 'youtube') && window=$(xdotool getwindowname $(xdotool getwindowfocus) | awk '{print tolower($window)}') && for prg in ${progs[*]}; do if [[ $window =~ "$prg" ]]; then Profile1; fi; done


## Conditions du Profile2:

# Si un son est joué
if [ `pactl list | grep State | grep RUNNING -c` -gt 0 ]; then Profile2; fi;


## Sinon, Profile0 (par défaut):
Profile0
Modifié en dernier par hom le 17 Oct 2016, 19:37, modifié 3 fois.

Affichage et crontab : DISPLAY & DBUS_SESSION_BUS_ADDRESS

#2Messageil y a 1 an

Bonjour
Non, on ne peut pas dire que ce soit lié à Xfce. Je déplace le sujet.
Crontab est conçu pour lancer des commandes à des moments précis et réguliers et non pas en fonction de condition particulières.
Donc cron ne me semble pas adapté dans ce cas.
Si les colonnes de temps sont toutes marquées d'étoiles, la commande est censée se déclencher à chaque secondes....
D'autres part, je crois que la commande doit être indiquée par son chemin canonique.
Exemple: je me suis fait un script.sh dans mon home qui sauvegarde automatiquement un serveur ftp. Je le lance chaque jour à 2h00:
Mon cron ressemble donc à ceci:

0  02 * * * /bin/bash /home/toto/script.sh

Après s'il s'agit de lancer ton script au démarrage de certaines applications, tu peux modifier directement la commande du lanceur en y rajoutant
&& ./ton_script.sh

Affichage et crontab : DISPLAY & DBUS_SESSION_BUS_ADDRESS

#3Messageil y a 1 an

Bonjour,

Les cinq étoiles correspondent bien à un job toutes les minutes. J'ai fait le test, édition avec crontab -e, mis la ligne de @hom et ça ne fonctionne pas avec notify-send ou /usr/bin/notify-send, par contre j'ouvre bien un xterm toute les minutes avec cette ligne:

* *    * * *    export DISPLAY=:0 && /usr/bin/xterm

et je vois bien les sessions s'ouvrir et se fermer avec :

systemctl status cronie


Je suppose qu'on peut aussi se faire un timer systemd pour lancer un script régulièrement.

Affichage et crontab : DISPLAY & DBUS_SESSION_BUS_ADDRESS

#4Messageil y a 1 an

lemust83 a écrit :Non, on ne peut pas dire que ce soit lié à Xfce. Je déplace le sujet.

Merci ! :)

lemust83 a écrit :Crontab est conçu pour lancer des commandes à des moments précis et réguliers et non pas en fonction de condition particulières.
Donc cron ne me semble pas adapté dans ce cas.

Cron me servira à lancer mon script toutes les 10 minutes. C'est mon script qui gère les conditions. Donc cron me semble au contraire tout à fait adapté pour ce que je veux faire.

lemust83 a écrit :Si les colonnes de temps sont toutes marquées d'étoiles, la commande est censée se déclencher à chaque secondes....
D'autres part, je crois que la commande doit être indiquée par son chemin canonique.

L'exemple que j'ai mis sert juste à illustrer le problème que je rencontre avec cron pour "travailler" sur le bon écran/affichage. notify-send est un bon exemple pour ça. La tâche cron s'execute pas toutes les secondes mais toutes les minutes. C'est uniquement pour débugguer. Et pas besoin de spécifier le chemin. D'ailleurs il est possible de vérifier avec la tâche suivante par exemple (qui fonctionne puisque le fichier /tmp/test.txt est créé et contient la version de notify-send) :

* * * * * notify-send -v >/tmp/test.txt


lemust83 a écrit :Après s'il s'agit de lancer ton script au démarrage de certaines applications, tu peux modifier directement la commande du lanceur en y rajoutant
&& ./ton_script.sh

Non, c'est pas du tout ce que je veux... Mais merci quand même pour tes retours !


Smurf a écrit :Je suppose qu'on peut aussi se faire un timer systemd pour lancer un script régulièrement.

Je vais regarder de ce côté, mais ça m'embête de ne pas réussir à travailler avec crontab. Merci pour le suggestion en tous cas, je ne savais pas que c'était possible.

Affichage et crontab : DISPLAY & DBUS_SESSION_BUS_ADDRESS

#5Messageil y a 1 an

hom a écrit :
Smurf a écrit :Je suppose qu'on peut aussi se faire un timer systemd pour lancer un script régulièrement.

Je vais regarder de ce côté, mais ça m'embête de ne pas réussir à travailler avec crontab. Merci pour le suggestion en tous cas, je ne savais pas que c'était possible.

Intéressant les timers systemd ! Un peu plus complexes que crontab mais aussi bien plus puissants. Pour ceux que ça intéresse : https://wiki.archlinux.org/index.php/Systemd/Timers
Pour autant, ça ne change rien au problème. Le résultat est le même qu'avec crontab.

Mais j'ai trouvé la solution. Spécifier la variable DISPLAY n'est pas suffisant, il faut aussi spécifier la variable DBUS_SESSION_BUS_ADDRESS. C'est cependant un peu plus complexe... Je me suis inspiré d'un paquet AUR qui justement envoit une notification via notify-send à tous les utilisateurs. Au final, il faut ajouter les deux lignes suivantes en début de script :

export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep gconf-helper)/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//')
export DISPLAY=$(grep -z DISPLAY /proc/$(pgrep gconf-helper)/environ | sed 's/DISPLAY=//')

Ainsi, notify-send fonctionne comme n'importe quel autre code relatif à l'affichage. Mon script fonctionne donc également sans difficulté. Je n'ai plus qu'à l'installer dans crontab ou via un timer systemd.

Merci pour votre aide et merci à parchd, l'auteur du paquet où j'ai trouvé la solution.

Bonne semaine !

Affichage et crontab : DISPLAY & DBUS_SESSION_BUS_ADDRESS

#6Messageil y a 1 an

Merci pour le partage. :bien

Répondre