Hice un guión que debería notificarme cuando hay un nuevo capítulo de manga que estoy leyendo. Usé el comando notify-send para hacer esto. El programa funciona cuando intento ejecutarlo en la terminal. La notificación se muestra. Sin embargo, cuando coloqué esto en mi crontab, la notificación no se muestra. Estoy bastante seguro de que el programa se está ejecutando, ya que lo hice para crear un archivo para mí. El archivo fue creado, pero la notificación no se mostró.
Aquí está mi guión
#!/bin/bash
#One Piece Manga reminder
#I created a file named .newop that contains the latest chapter.
let new=$(cat ~/.newop)
wget --read-timeout=30 -t20 -O .opreminder.txt http://www.mangareader.net/103/one-piece.html
if (( $(cat .opreminder.txt | grep "One Piece $new" | wc -l) >=1 ))
then
(( new+=1 ))
echo $new
echo $new > ~/.newop
notify-send "A new chapter of One Piece was released."
else
notify-send "No new chapter for One Piece."
notify-send "The latest chapter is still $new."
fi
exit
Y esto es lo que escribí en mi crontab
0,15,30,45 12-23 * * 3 /home/jchester/bin/opreminder.sh
cron
notify-send
usuario158335
fuente
fuente
export DISPLAY=:0
.16.04
, este funcionó para mí*/1 * * * * eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";/usr/bin/notify-send -i appointment -c "im" "Keep Working"
Respuestas:
Los comandos deben hacer referencia a su ubicación. Entonces
notify-send
necesita ser/usr/bin/notify-send
Todos los comandos deben tener su ruta completa.
Use el
whereis notify-send
comando para ver dónde "viven" sus comandosfuente
notify-send
está a laPATH
altura de un trabajo cron. Vea mi respuesta a continuación.Las cosas parecen ser diferentes en 13.04, al menos en Gnome Shell.
Primero, esto es lo que se
env
imprime cuando se ejecuta desde elzzyxy
trabajo cron del usuario (no del root):Para ponerse
notify-send
a trabajar, parece ser necesario establecer laDBUS_SESSION_BUS_ADDRESS
variable de entorno, según el comentario de DahitiF en ubuntuforums.org. Simplemente anteponga lo siguiente a su descripción de trabajo real:No parece ser necesario configurarlo
DISPLAY
.fuente
gnome-session
axfce4-session
.gnome-session
y usé en sugnome-shell
lugar (tenga cuidado, también hay ungnome-shell-calendar-server
asípgrep
que obtendrá 2 pids). También lo necesitabaDISPLAY=:0
porque estoy usando 2 pantallas físicas y no estaba definido. ¡Gracias!openbox
porgnome-session
.El comando
notify-send
no muestra el mensaje en la pantalla cuando lo inicia cron. Simplemente agregue la pantalla de destino en la parte superior de su script, por ejemplo:fuente
gdk_mir_display_open Failed to connect to Mir: Failed to connect to server socket: No such file or directory Option parsing failed: Cannot open display:
echo $DISPLAY
en un terminal para asegurarse de que su pantalla realmente lo sea:0
(generalmente lo es, pero no siempre)Al menos para Ubuntu 14.04, la respuesta anterior de klrmr es la respuesta correcta. No parece ser necesario configurar DISPLAY o articular rutas completas para notificar-enviar o cualquier otra cosa normalmente en $ PATH.
A continuación se muestra un script cron que estoy usando para apagar una máquina virtual cuando el estado de la batería de una computadora portátil es demasiado bajo. La configuración de línea DBUS_SESSION_BUS_ADDRESS en la respuesta de klrmr anterior es la modificación que finalmente hizo que las advertencias funcionaran correctamente.
fuente
En mi caso con ubuntu 16.04 se requería una ruta explícita, resuelvo el problema simplemente agregando
en las primeras líneas del crontab, antes de la llamada notificar-enviar.
fuente
El primer culpable es su archivo crontab, también debe mencionar el nombre de usuario con el que se debe ejecutar el script, mejor mantenerlo como root
y luego debe usar el nombre de usuario del usuario de la GUI dentro del script y anteponerlo para notificar-enviar con "sudo o su" para ejecutar el comando como un usuario que posee la GUI
ejemplo:
o
¿Dónde
gnome_user_name
está el nombre de usuario del usuario que inició la sesión GUI? Es usted quien inició sesión, y si desea que sea una elección dinámica, puede obtenerlo deejemplo:
o
fuente
oniltonmaciel
, pero$GNOME_USER
se mostraríaonilton+
(no funciona)La forma en que el binario recupera la dirección dbus parece haber cambiado últimamente. En Ubuntu 15.04 (Vivid Vervet) con "notificar-enviar 0.7.6", se necesitan las siguientes dos variables:
La declaración de 'krlmlr' se evalúa bien y establece la dirección correcta, pero el diálogo no aparecerá desde un trabajo cron.
fuente
Si su script en crontab se ejecuta como root, las respuestas anteriores probablemente no funcionarán. Pruebe esta función, que funciona bien para mí en 16.04:
(Fuente: https://unix.stackexchange.com/a/344377/7286 )
fuente
Es mejor confiar en el
dbus-session
proceso, debería ejecutarse para todos los sistemas dondeDBUS_SESSION_BUS_ADDRESS
está presente.Crea un script:
Hazlo ejecutable:
Agréguelo a crontab:
fuente
Esto tardó una eternidad en hacer que el trabajo en ubuntu 15.10, Tuviese que agregar una fuente para que los usuarios tengan un entorno normal. mi pantalla fue: 1 por alguna razón también. Utilizando los primeros resultados de gnome-session pid para la búsqueda DBUS_SESSION_BUS_ADDRESS.
fuente
Acabo de hacer que esto funcione con el escritorio de canela en Ubuntu 15.10, usando la siguiente receta:
El truco fue darse cuenta de que 'canela-sesión' es demasiado larga para que pgrep encuentre:
También tuve que usar \ grep porque mi grep tiene un alias para
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
Problema causado al llamar
python3
a crontab conUTF-8
locale.TL; DR: llamada de prefijo en crontab w / locale como en:
Ver también click y python3 :
fuente
Para todos los guiones crontab que usan libnotify, uso esto:
Funciona incluso si uso cron en modo raíz.
fuente
Todo lo que necesitas es X_user y X_userid. Reemplace ambos en el siguiente comando.
Solución con systemd
/etc/systemd/system/opreminder.service #Service file
/etc/systemd/system/opreminder.timer #timer file
/home/jchester/bin/opreminder.sh #El script
No es necesario usar sudo -u si el archivo de servicio ya está configurado con el usuario deseado
Fuente: https://wiki.archlinux.org/index.php/Desktop_notifications#Usage_in_programming
fuente