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.
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 :
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() {
# 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
# 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
# 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
Dernière modification par homil y a 7 ans, modifié au total 3 fois.
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
Noyau récent MANJARO x86_64 bits: 64 Xfce 4.16
ASUSTeK model: PRIME B350M-A v: Rev X.0x
6-Core: AMD Ryzen 5 2600X
AMD Baffin [Radeon RX 460/560D / Pro
driver: amdgpu v: kernel
Display: x11 server: X.Org driver: amdgpu,ati unloaded: modesetting
OpenGL: renderer: Radeon RX 560 Series
Arch en Dual. Aucun lien publicitaire ne saurait être toléré dans la signature!
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.
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.
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.