Se ha cambiado el servicio de notificaciones para ubuntu 14.04
.
Ahora se llama algo así como org.freedesktop.Notifications.service
Puede consultar aquí para obtener más información sobre Notification On Screen Display
posibilidades.
También puede usar la siguiente línea de comando para enviar sus propios mensajes
[email protected] ~$ notificar-enviar “Texto del mensaje”
Simplemente actualice su secuencia de comandos que se lanzará por udev
para usarlo.
Para solucionar el problema relacionado con la ejecución de notify-send
comando como root.
Intente ejecutar como su usuario normal, es decir,
su <YOURUSER> -c 'notify-send “Text of message”'
Probé la solución de Fabio A. Sin embargo, noté que no funcionaba de manera consistente en mi instalación de Arch Linux. El problema fue que who
no mostró el número de puerto para la sesión tty1:
$ who
john tty1 2021-03-21 09:02
Estoy ejecutando i3 a través de exec startx
en mi instalación de Arch. Por otro lado, noté que la salida de who
en una instalación de escritorio de Ubuntu se veía completamente diferente. Aquí se muestra el número de pantalla:
$ who
john :0 2021-03-21 09:49 (:0)
Así que estaba buscando otra solución para deshacerme del who
dominio. Encontré que ps aux
contiene esta entrada útil que contiene tanto el número de visualización como el nombre de usuario:
$ 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
Este es el nuevo guión que escribí:
#/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
Cualquier otro script puede llamar a este script a través de:
bash /opt/notify-send-helper Title Message -t 5000
En una nota al margen:estoy usando dunstify
en lugar de notify-send
. dunstify
tiene la ventaja de poder asignar ID a una notificación:solo se muestra la notificación más reciente para la misma ID.
EDITAR:solía consultar el proceso "Xorg". Sin embargo, por extraño que parezca, noté en una máquina que este proceso se ejecutaba como root. Cambié al proceso "xinit", que funciona igual pero parece que siempre lo ejecuta el usuario normal.
Para enviar una notificación de escritorio desde un script en segundo plano que se ejecuta como raíz
(reemplace X_user y X_userid con el usuario y el ID de usuario que ejecutan X respectivamente):
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.'
Esto fue tomado de:https://wiki.archlinux.org/index.php/Desktop_notifications
Combinar la respuesta de tomy con la respuesta de hongo a otra pregunta me resuelve el problema de manera elegante.
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]"
}
Esa función se puede usar tal cual en cualquier script que se ejecute como root
, como reemplazo directo del notify-send
comando.