Le service de notification a été modifié pour ubuntu 14.04
.
Il s'appelle maintenant quelque chose comme org.freedesktop.Notifications.service
Vous pouvez vérifier ici pour plus d'informations sur Notification On Screen Display
possibilités.
Vous pouvez également utiliser la ligne de commande suivante pour envoyer vos propres messages
[email protected] ~$ notify-send "Texte du message"
Mettez simplement à jour votre script qui est lancé par udev
pour l'utiliser.
Pour contourner le problème lié à l'exécution du notify-send
commande en tant que root.
Essayez d'exécuter en tant qu'utilisateur normal, c'est-à-dire
su <YOURUSER> -c 'notify-send “Text of message”'
J'ai essayé la solution de Fabio A. Cependant, j'ai remarqué que cela ne fonctionnait pas de manière cohérente sur mon installation Arch Linux. Le problème était que who
n'a pas affiché le numéro de port pour la session tty1 :
$ who
john tty1 2021-03-21 09:02
J'utilise i3 via exec startx
sur mon installation Arch. Par contre, j'ai remarqué que la sortie de who
sur une installation de bureau Ubuntu était complètement différente. Ici, le numéro d'affichage est affiché :
$ who
john :0 2021-03-21 09:49 (:0)
Je cherchais donc une autre solution pour me débarrasser du who
commande. J'ai trouvé que ps aux
contient cette entrée utile qui contient à la fois le numéro d'affichage ainsi que le nom d'utilisateur :
$ ps aux | grep xinit
john 785 763 0 19:14 tty1 S+ 0:00 xinit /home/john/.xinitrc -- /etc/X11/xinit/xserverrc :0 vt1 -keeptty -auth /tmp/serverauth.gGcqw2rJXG
Voici le nouveau script que j'ai écrit :
#/bin/bash
xinit_pid=$(pgrep xinit)
if [ -n "xinit_pid" ]; then
xinit_ps=$(ps --no-headers -f $xinit_pid | head -n 1)
display=$(echo "$xinit_ps" | grep -Po " :[0-9]+ " | tr -d " ")
user=$(echo "$xinit_ps" | cut -d " " -f 1)
uid=$(id -u $user)
echo "Display environment: $display $user $uid"
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "[email protected]"
else
echo "Warning: Could not find xinit process!"
fi
Tout autre script peut appeler ce script via :
bash /opt/notify-send-helper Title Message -t 5000
En passant :j'utilise dunstify
au lieu de notify-send
. dunstify
a l'avantage de pouvoir attribuer des identifiants à une notification :seule la notification la plus récente pour le même identifiant est affichée.
EDIT :J'avais l'habitude d'interroger le processus "Xorg". Cependant, assez étrangement, j'ai remarqué sur une machine que ce processus était exécuté en tant que root. Je suis passé au processus "xinit" à la place qui fonctionne de la même manière mais semble toujours exécuté par l'utilisateur normal.
Pour envoyer une notification de bureau à partir d'un script d'arrière-plan exécuté en tant que root
(remplacez X_user et X_userid par l'utilisateur et l'ID utilisateur exécutant X respectivement) :
sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!' 'This is an example notification.'
Cela a été tiré de :https://wiki.archlinux.org/index.php/Desktop_notifications
Combiner la réponse de tomy avec la réponse de hongo à une autre question résout élégamment le problème pour moi.
function notify-send() {
#Detect the name of the display in use
local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
#Detect the user using such display
local user=$(who | grep '('$display')' | awk '{print $1}' | head -n 1)
#Detect the id of the user
local uid=$(id -u $user)
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "[email protected]"
}
Cette fonction peut être utilisée telle quelle dans n'importe quel script exécuté en tant que root
, en remplacement du notify-send
commande.