Il servizio di notifica è stato modificato per ubuntu 14.04
.
Ora si chiama smth come org.freedesktop.Notifications.service
Puoi controllare qui per ulteriori informazioni su Notification On Screen Display
possibilità.
Inoltre puoi utilizzare la seguente riga di comando per inviare i tuoi messaggi
[email protected] ~$ notify-send “Testo del messaggio”
Aggiorna semplicemente il tuo script che viene lanciato da udev
per usarlo.
Per aggirare il problema relativo all'esecuzione del notify-send
comando come root.
Prova a eseguire come utente normale, ovvero
su <YOURUSER> -c 'notify-send “Text of message”'
Ho provato la soluzione di Fabio A. Tuttavia, ho notato che non funzionava in modo coerente sulla mia installazione di Arch Linux. Il problema era quel who
non mostrava il numero di porta per la sessione tty1:
$ who
john tty1 2021-03-21 09:02
Sto eseguendo i3 tramite exec startx
sulla mia installazione Arch. D'altra parte, ho notato che l'output di who
su un'installazione desktop di Ubuntu sembrava completamente diversa. Qui viene mostrato il numero del display:
$ who
john :0 2021-03-21 09:49 (:0)
Quindi stavo cercando un'altra soluzione per sbarazzarmi di who
comando. Ho trovato quel ps aux
contiene questa voce utile che contiene sia il numero visualizzato che il nome utente:
$ 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
Questo è il nuovo script che ho scritto:
#/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
Qualsiasi altro script può chiamare questo script tramite:
bash /opt/notify-send-helper Title Message -t 5000
Nota a margine:sto usando dunstify
invece di notify-send
. dunstify
ha il vantaggio di poter assegnare ID a una notifica:viene mostrata solo la notifica più recente per lo stesso ID.
EDIT:ero solito interrogare il processo "Xorg". Tuttavia, stranamente ho notato su una macchina che questo processo è stato eseguito come root. Sono invece passato al processo "xinit" che funziona allo stesso modo ma sembra essere sempre eseguito dall'utente normale.
Per inviare una notifica sul desktop da uno script in background eseguito come root
(sostituisci X_user e X_userid con l'utente e l'id utente che eseguono rispettivamente X):
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.'
Questo è stato preso da:https://wiki.archlinux.org/index.php/Desktop_notifications
La combinazione della risposta di tomy con la risposta di hongo a un'altra domanda risolve elegantemente il problema per me.
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]"
}
Tale funzione può essere utilizzata così com'è in qualsiasi script eseguito come root
, in sostituzione immediata del notify-send
comando.