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

Besoin d'aide sur script shell et notification

#1Messageil y a 10 ans

Bonsoir,

j'ai fait un script shell qui fonctionne parfaitement pour ce que je lui demande, mais voilà, j'ai voulu que ce script passe des messages sur son état d'avancement dans la zone de notification.
que j'utilise Notify-send ou Kdialog, mes notifications fonctionnent très bien; là où ça se complique, c'est que je programme l'utilisation de mon script avec Cron (avec Kcron sous Kde), et dans ce cas, mes notifications ne s'affichent plus (mais je sais que le script fonctionne puisqu'il fait un fichier de log).
je me suis donc fait un script de test pour trouver ce qui ne va pas:

#!/bin/sh
kdialog --passivepopup "test en situation" 5

ce qui marche en lançant le script manuellement, mais pas avec Cron; pareil avec Notify-send.
si je le fais avec Wall, ça fonctionne:

echo -e "test en situation" | /usr/bin/wall

le problème est que Wall affiche tout un tas d'infos non pertinentes à mon sens et que le message important ne se voit plus...

j'ai fini par comprendre qu'avec Cron on a un problème de display, puisque Cron travaille dans un autre terminal que celui de la session graphique, donc j'ai essayé:

#!/bin/sh
export DISPLAY=:0
kdialog --passivepopup "test en situation" 5

dans ce cas ça fonctionne, mais au lieu de s'afficher dans la zone de notification déroulante du systray de Kde comme les autres notifications, ça s'affiche dans un vilain carré gris au milieu de l'écran...

et là j'ai plus d'idée, sauf celle qu'il faudrait que j'ajoute une autre variable d'environnement, mais laquelle ?

pour voir les différences de variables d'environnement entre une session graphique et Cron, j'ai ajouté ça dans le script:

env >> /home/david/testlog.log

et à l'éxécution du script par Cron, testlog.log se remplit avec ça:

SHELL=/bin/sh
USER=david
PATH=/usr/bin:/bin
PWD=/home/david
LANG=fr_FR.UTF-8
HOME=/home/david
SHLVL=2
LOGNAME=david
BROWSER=/usr/bin/xdg-open
DISPLAY=:0
_=/usr/bin/env

ce qui est assez peu par rapport à ce qu'on obtient avec la commande "env" dans le terminal:

XDG_VTNR=1
SSH_AGENT_PID=1009
XDG_SESSION_ID=1
KDE_MULTIHEAD=false
GPG_AGENT_INFO=/tmp/gpg-Vk4IYB/S.gpg-agent:1006:1
SHELL=/bin/bash
TERM=xterm
HISTSIZE=10000
GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/david/.gtkrc-2.0:/home/david/.kde4/share/config/gtkrc-2.0
KONSOLE_DBUS_SERVICE=:1.79
KONSOLE_PROFILE_NAME=Terminal
GS_LIB=/home/david/.fonts
GTK_RC_FILES=/etc/gtk/gtkrc:/home/david/.gtkrc:/home/david/.kde4/share/config/gtkrc
WINDOWID=44040219
SHELL_SESSION_ID=bb86165bcb43400088c96cc517908354
GTK_MODULES=canberra-gtk-module
KDE_FULL_SESSION=true
HISTFILESIZE=10000
USER=david
SSH_AUTH_SOCK=/tmp/ssh-fyqf0u7CQinJ/agent.1008
SESSION_MANAGER=local/asusx50vl:@/tmp/.ICE-unix/1067,unix/asusx50vl:/tmp/.ICE-unix/1067
MOZ_PLUGIN_PATH=/usr/lib/mozilla/plugins
DESKTOP_SESSION=KDE Plasma Workspace
MAIL=/var/spool/mail/david
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin/vendor_perl:/usr/bin/core_perl
LC_COLLATE=C
PWD=/home/david
JAVA_HOME=/usr/lib/jvm/java-7-openjdk
KONSOLE_DBUS_WINDOW=/Windows/1
KDE_SESSION_UID=1000
LANG=fr_FR.UTF-8
KONSOLE_DBUS_SESSION=/Sessions/1
HISTCONTROL=ignoreboth
HOME=/home/david
COLORFGBG=15;0
XDG_SEAT=seat0
SHLVL=3
KDE_SESSION_VERSION=4
LANGUAGE=
XCURSOR_THEME=Oxygen_White
LOGNAME=david
XDG_DATA_DIRS=/usr/share:/usr/share:/usr/local/share
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-Y8F6HW6QxY,guid=72d4028630575b95e5789624525a5547
BROWSER=/usr/bin/xdg-open
PROFILEHOME=
XDG_RUNTIME_DIR=/run/user/1000
DISPLAY=:0
QT_PLUGIN_PATH=/home/david/.kde4/lib/kde4/plugins/:/usr/lib/kde4/plugins/
XDG_CURRENT_DESKTOP=KDE
_=/usr/bin/env

mais comme je ne vais pas faire tous ces exports dans mon script, et que je ne peux pas tout tester un par un avec Cron (ajouter un export, programmer Cron pour une éxécution dans une minute, attendre...), j'aimerais bien savoir quelle(s) variable(s) d'environnement serai(en)t utile(s) pour que mes notifications s'affichent normalement...

si quelqu'un a une idée...

PS: je sais que pour un truc qui s'éxécute en différé, il n'est pas vital d'avoir des notifications, surtout que je serai pas forcément devant, mais comme on dit, c'est inutile, donc indispensable...

Besoin d'aide sur script shell et notification

#2Messageil y a 10 ans

Après une petite recherche, je trouve que la variable importante c'est DBUS_SESSION_BUS_ADDRESS.
Voici les quelques liens que j'ai pu trouvé (warning, english inside):
http://superuser.com/questions/111771/using-either-notify-send-or-zenity-in-cron
http://unix.stackexchange.com/questions/28463/run-a-dbus-program-in-crontab-how-to-know-about-the-session-id
http://unix.stackexchange.com/questions/25684/how-to-access-x-display-from-a-cron-job-when-using-gdm3
http://www.guyrutenberg.com/2012/08/17/sending-desktop-notification-from-cron/

J'essaie d'éplucher ça.

EDIT :
Bon alors après quelques test : ça, ça marche : http://superuser.com/questions/111771/using-either-notify-send-or-zenity-in-cron.
Ce que j'ai fait, j'ai copié collé mon "env | grep DBUS_SESSION_BUS_ADDRESS", j'ai mis un export devant et collé le tout au-dessus d'un script d'essai, et ça marche.
Après, je pense qu'il faut faire comme il est conseillé, de mettre un petit script au démarage de la session graphique, du type

echo "export $(env | grep BUS_SESSION_BUS_ADDRESS)" > /tmp/notify-send

Il suffit alors de placer un petit "source /tmp/notify-send" au-dessus de ton script et ça devrait être bon.

Besoin d'aide sur script shell et notification

#3Messageil y a 10 ans

J'ai testé de mon côté:
un fichier crontab

* * * * * DISPLAY=:0.0 /tmp/test_cron.sh

un fichier Bash

#!/bin/bash
DISPLAY=:0.0 /usr/bin/notify-send -t 10 Test "This is a test"

Chaque minute, la chaine de test est affichée par notify-send
[EDIT]
Ou alors avec

#!/bin/bash
DISPLAY=:0.0 /usr/bin/notify-send -t 10 Test "`date -R`"

Et date et heure s'affichent correctement

Besoin d'aide sur script shell et notification

#4Messageil y a 10 ans

le coup du BUS_SESSION_BUS_ADDRESS, je l'ai essayé, en faisant comme ça:

#!/bin/sh
export DISPLAY=:0

if [[ -z "$DBUS_SESSION_BUS_ADDRESS" ]];
then source "$HOME/.dbus/session-bus"/*-0 && export DBUS_SESSION_BUS_ADDRESS;
fi

env >> /home/david/testlog.log
echo "test en situation" | kdialog --passivepopup "$(cat)" 5

et comme j'ai gardé mon "env >> /home/david/testlog.log", j'ai pu vérifier que c'était bien pris en compte correctement; dans mon testlog.log, j'ai bien une ligne:

DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-Q091AB1jCD,guid=a2b845b9c4ccc03c2669b98f525a7f89

qui correspond bien à ce qu'il y a dans ~/.dbus/session-bus/********-0; donc avec ça, mon script reste valable même après deco-reco...

le seul truc, c'est que ça change rien: le popup s'affiche toujours dans un cadre moche au milieu de l'écran au lieu de la notif Kde quand on se sert de Cron (mais ça marche toujours normalement quand on lance en manuel).

je pense qu'il y a une variable spécifique à Kde, faut que je trouve laquelle...

Besoin d'aide sur script shell et notification

#5Messageil y a 10 ans

Je suis sous xfce : ceci explique (peut être) cela !

Besoin d'aide sur script shell et notification

#6Messageil y a 10 ans

oui, et Ytterbium est sous Openbox...
j'ai Openbox installé, je vais essayer dessus pour voir.

Besoin d'aide sur script shell et notification

#7Messageil y a 10 ans

Ce qui est bizarre, c'est que moi, je n'ai pas de dossier .dbus. Je me demande pourquoi, alors que toi tu en as un.

Besoin d'aide sur script shell et notification

#8Messageil y a 10 ans

quel DM utilises-tu ? Slim ou Lxdm ?

j'ai essayé sous Openbox, aucun affichage avec Notify-send, et affichage au milieu dans le cadre moche avec Kdialog (mais là c'est plutôt normal, puisque la notification Kde n'est pas là).

les variables de Kde et de Qt que j'ai essayé jusqu'à présent ont fait crasher Kdialog, et il faut que je redémarre à chaque fois car ces exports sont conservés par Cron...

Besoin d'aide sur script shell et notification

#9Messageil y a 10 ans

Loubrix a écrit :quel DM utilises-tu ? Slim ou Lxdm ?

startx

Loubrix a écrit :j'ai essayé sous Openbox, aucun affichage avec Notify-send, et affichage au milieu dans le cadre moche avec Kdialog (mais là c'est plutôt normal, puisque la notification Kde n'est pas là).

Tu n'as aucun affichage avec notify-send, même en script "normal" ? Tu as bien le paquet xfce4-notifyd ?

Sinon, tu as testé l'option "--dsiplay" de kdialog ?

Besoin d'aide sur script shell et notification

#10Messageil y a 10 ans

et qu'as tu dans ton ~/.xinitrc ?

je n'ai pas testé l'option --display de Kdialog, simplement parce que cette option ne figure pas dans la seule doc locale: le --help (aucun man pour Kdialog).
mais je vais essayer ça...

Besoin d'aide sur script shell et notification

#11Messageil y a 10 ans

Un bête :

if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for f in /etc/X11/xinit/xinitrc.d/*; do
    [ -x "$f" ] && . "$f"
  done
  unset f
fi

numlockx &
exec openbox-session

Besoin d'aide sur script shell et notification

#12Messageil y a 10 ans

effectivement, tu ne lances pas de session Dbus dans ton xinitrc, mais normalement (et tu peux vérifier), il y a ce qu'il faut dans /etc/X11/xinit/xinitrc.d

Besoin d'aide sur script shell et notification

#13Messageil y a 10 ans

Effectivement, j'ai un beau

if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] && type dbus-launch >/dev/null; then
  eval $(dbus-launch --sh-syntax --exit-with-session)
fi

Besoin d'aide sur script shell et notification

#14Messageil y a 10 ans

Besoin d'aide sur script shell et notification

#15Messageil y a 10 ans

je vais tester ça, parce que l'export de dbus me fait crasher Kdialog en fin de compte...

Besoin d'aide sur script shell et notification

#17Messageil y a 10 ans

ben en fin de compte, n'ayant rien trouvé de mieux, je me contente des vilaines notifications, et puis le reste fonctionne et fait ce que je lui demande...
Répondre