Der Benachrichtigungsdienst wurde für ubuntu 14.04
geändert .
Es heißt jetzt so etwas wie org.freedesktop.Notifications.service
Weitere Informationen zu Notification On Screen Display
finden Sie hier Möglichkeiten.
Sie können auch die folgende Befehlszeile verwenden, um Ihre eigenen Nachrichten zu senden
[email protected] ~$ benachrichtigen-senden „Text der Nachricht“
Aktualisieren Sie einfach Ihr Skript, das von udev
gestartet wird um es zu verwenden.
Zur Umgehung des Problems im Zusammenhang mit der Ausführung von notify-send
Befehl als root.
Versuchen Sie, es als Ihr normaler Benutzer auszuführen, d. h.
su <YOURUSER> -c 'notify-send “Text of message”'
Ich habe die Lösung von Fabio A ausprobiert. Ich habe jedoch festgestellt, dass es auf meiner Arch-Linux-Installation nicht konsistent funktionierte. Das Problem war, dass who
hat die Portnummer für die tty1-Sitzung nicht angezeigt:
$ who
john tty1 2021-03-21 09:02
Ich verwende i3 über exec startx
auf meiner Arch-Installation. Andererseits ist mir aufgefallen, dass die Ausgabe von who
auf einer Ubuntu-Desktop-Installation sah das ganz anders aus. Hier wird die Anzeigenummer angezeigt:
$ who
john :0 2021-03-21 09:49 (:0)
Also suchte ich nach einer anderen Lösung, um den who
loszuwerden Befehl. Ich habe das ps aux
gefunden enthält diesen nützlichen Eintrag, der sowohl die Anzeigenummer als auch den Benutzernamen enthält:
$ 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
Dies ist das neue Skript, das ich geschrieben habe:
#/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
Jedes andere Skript kann dieses Skript aufrufen über:
bash /opt/notify-send-helper Title Message -t 5000
Nebenbei bemerkt:Ich verwende dunstify
statt notify-send
. dunstify
hat den Vorteil, einer Benachrichtigung IDs zuordnen zu können:Es wird nur die neuste Benachrichtigung für dieselbe ID angezeigt.
EDIT:Früher habe ich den Prozess "Xorg" abgefragt. Seltsamerweise bemerkte ich jedoch auf einer Maschine, dass dieser Prozess als root ausgeführt wurde. Ich habe stattdessen zum "xinit"-Prozess gewechselt, der genauso funktioniert, aber anscheinend immer vom normalen Benutzer ausgeführt wird.
So senden Sie Desktop-Benachrichtigungen von einem Hintergrundskript, das als Root ausgeführt wird
(Ersetzen Sie X_user und X_userid durch den Benutzer bzw. die Benutzer-ID, die X ausführen):
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.'
Dies wurde entnommen aus:https://wiki.archlinux.org/index.php/Desktop_notifications
Die Kombination von Tomys Antwort mit Hongos Antwort auf eine andere Frage löst das Problem für mich elegant.
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]"
}
Diese Funktion kann unverändert in jedem Skript verwendet werden, das als root
ausgeführt wird , als Drop-in-Ersatz für notify-send
Befehl.