Estoy usando Arch Linux con KDE / Awesome WM. Estoy tratando de ponerme
notify-send
a trabajar cron
.
He intentado establecer DISPLAY
/ XAUTHORITY
variables y ejecutar notify-send
con "sudo -u", todo sin resultado.
Puedo llamar a notificar-enviar interactivamente desde la sesión y recibir notificaciones.
FWIW, el trabajo cron está funcionando bien, lo cual verifiqué haciendo eco de cosas en un archivo temporal. Es solo el "notificar-enviar" que no funciona.
Código:
[matrix@morpheus ~]$ crontab -l
* * * * * /home/matrix/scripts/notify.sh
[matrix@morpheus ~]$ cat /home/matrix/scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
echo "testing cron" >/tmp/crontest
sudo -u matrix /usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
[matrix@morpheus ~]$ cat /tmp/crontest
testing cron
now tested notify-send
[matrix@morpheus ~]$
Como puede ver, el eco antes y después de notificar-enviar funcionó.
También he intentado configurarDISPLAY=:0.0
ACTUALIZACIÓN: Busqué un poco más y descubrí que DBUS_SESSION_BUS_ADDRESS debe establecerse. ¡Y después de codificar esto usando el valor que obtuve de mi sesión interactiva, el pequeño mensaje de "hola" comenzó a aparecer en la pantalla cada minuto!
Pero el problema es que esta variable no es permanente por esa publicación, por lo que tendré que probar la solución de tubería con nombre sugerida allí.
[matrix@morpheus ~]$ cat scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-BouFPQKgqg,guid=64b483d7678f2196e780849752e67d3c
echo "testing cron" >/tmp/crontest
/usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
Dado cron
que no parece admitir notificación-envío (al menos no directamente), ¿hay algún otro sistema de notificación que sea más cron
amigable que pueda usar?
&>>/tmp/crontest
a la línea de envío de notificaciones y ve sinotify-send
da algún mensaje de error?Respuestas:
Necesitas establecer la
DBUS_SESSION_BUS_ADDRESS
variable. Por defecto, cron no tiene acceso a la variable. Para remediar esto, coloque el siguiente script en algún lugar y llámelo cuando el usuario inicie sesión, por ejemplo, utilizando awesome y larun_once
función mencionada en la wiki. Cualquier método funcionará, ya que no hace daño si la función se llama con más frecuencia de la requerida.Esto crea un archivo que contiene la variable de entorno Dbus requerida. Luego, en el script llamado por cron, importa la variable obteniendo el script:
Aquí hay una respuesta que usa el mismo mecanismo.
fuente
Debe configurar las variables en el crontab mismo:
No es
sudo
necesario, al menos no en mi sistema.fuente
La forma más segura de obtener variables ambientales relacionadas con la sesión X es obtenerlas del entorno de un proceso del usuario que ha iniciado sesión en X. Aquí hay una adaptación del script que uso exactamente para el mismo propósito (aunque DBUS_SESSION_BUS_ADDRESS no No parece ser un problema para mí en Debian):
Esto envía un mensaje al primer usuario X que encuentra, aunque puede agregar un bucle para enviarlo a todos los usuarios.
Actualizar
Parece que las actualizaciones al formato utmp hacen
who
que se imprima una pantalla en lugar de un tty en su segunda columna. Esto realmente facilita las cosas, anteriormente solo imprimía la pantalla en el comentario al final y decidí que no era seguro confiar en la respuesta original. Si este es el caso, intente esto:fuente
who_line
comando. La salida se ve asíme :0 2015-09-23 10:40 ? 17234
.Esta frase me funcionó en Manjaro con Cronie:
Sin el muy feo DBUS_blah_blah no funciona en absoluto. También me pareció
journalctl -xb -u cronie
útil. Todavía no estoy familiarizado con Cronie, pero creé mi "crontab" como/etc/cron.d/mycronjobs
y no estoy seguro de si ese nombre de archivo es obligatorio, o si solo lee todo en el directorio cron.d.Encontré la solución aquí https://wiki.archlinux.org/index.php/Desktop_notifications
fuente
Yo uso i3 en Ubuntu 18.04. Mi forma de resolver esto es:
* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"
fuente
Esto es suficiente para hacer que el envío de notificaciones funcione para mí en un trabajo cron en Ubuntu Trusty:
Simplemente exporta
DISPLAY
para el usuario como se está ejecutando el cronjob. Funciona para mí sin configurarXAUTHORITY
oDBUS_SESSION_BUS_ADDRESS
.fuente
Para aquellos en Linux que se sienten cómodos instalando paquetes de Python, acabo de lanzar un programa de notificación sin envío que funciona bien para mí. Busca
/proc
el nombre de usuario requerido y las variables de entorno y luego se ejecutanotify-send
con estas variables (se usarásudo
para cambiar al usuario requerido si es necesario).fuente
También puedes hacer un script:
Luego ejecútalo con
sudo
. Sin embargo, dado quecrontab -e
ejecuta todos los comandos con el usuario que lo creó, lo siguiente debería ser suficiente cuando se llama sinsudo
:Por lo menos lo hace por mí. Todo parece depender de la configuración del entorno.
fuente
Utilizo este script en cron para publicar MPD ahora jugando en twitter cada hora
secuencia de comandos similar que utiliza notificar-enviar
puede estar experimentando problemas ya que KDE usa su propio notificar-deamon IIRC
fuente
Por lo que vale....
Tuve que usar TODO lo siguiente en Debian Jessie para que esto funcione ...
Dejar de lado alguno de estos hizo que dejara de funcionar.
fuente
*-0
en susession-bus
directorio. Podrías haber querido decirsource "$HOME"/.dbus/session-bus/*-0
.Usando sudo:
Propina :
Podemos obtener el usuario x actual con este comando
Adicionalmente...
Bueno saber :
Cron que se ejecuta bajo root no tiene acceso a x, por lo tanto, no se mostrarán todos los comandos de interfaz gráfica de usuario, una solución simple es agregar root al usuario x autorizado para el usuario x actual con este comando
del usuario x shell
o
fuente
Aquí hay un script menos complejo que el que Graeme proporcionó. Su guión no funcionó para mí,
$who_line
siempre estaba vacío. Mi guión no pierde tanto tiempo en encontrar un proceso. En cambio, solo intenta todo y elige el último valor útil encontrado. Estoy ejecutando xubuntu 14.04 y tengo algunos contenedores lxc en ejecución que probablemente confunden este tipo de scripts.fuente
DBUS_SESSION_BUS_ADDRESS
. Puedo obtenerlo de mis proyectiles, pero no del proceso Xorg.