64 votes

Notify-send ne fonctionne pas depuis la crontab

J'ai fait un script qui devrait me notifier quand il y a un nouveau chapitre du manga que je suis en train de lire. J'ai utilisé la commande notify-send pour ce faire. Le programme fonctionne lorsque j'essaie de l'exécuter dans le terminal. La notification s'affiche. Cependant, lorsque je l'ai placé dans ma crontab, la notification ne s'affiche pas. Je suis presque sûr que le programme est en cours d'exécution puisque je lui ai demandé de créer un fichier pour moi. Le fichier a été créé, mais la notification ne s'est pas affichée.

Voici mon script

#!/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

Et voici ce que j'ai écrit dans ma crontab

0,15,30,45 12-23 * * 3   /home/jchester/bin/opreminder.sh

5voto

Raul R. Points 51

Dans mon cas avec ubuntu 16.04 un chemin explicite était nécessaire, je résous le problème en ajoutant simplement

DISPLAY=:0

aux premières lignes de la crontab, avant d'appeler notify-send.

2voto

Tristik Points 21

Cela a pris une éternité pour faire fonctionner sur ubuntu 15.10, j'ai dû ajouter une source pour obtenir les vars env normaux des utilisateurs. mon affichage était :1 pour une raison quelconque aussi. J'utilise le pid du premier résultat de gnome-session pour la recherche de DBUS_SESSION_BUS_ADDRESS.

# Crontab is
* 21 * * * /bin/sh /home/tristik/cron.sh

#!/bin/sh 
# cron.sh
# Notifies the user of date and time
source /home/tristik/.bashrc
pid=$(pgrep -u tristik gnome-session | head -n 1)
dbus=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )
export DBUS_SESSION_BUS_ADDRESS=$dbus
export HOME=/home/tristik
export DISPLAY=:1
/usr/bin/notify-send 'title' "$(/bin/date)"

1voto

Parvesh Monu Points 111

Utilice printenv pour imprimer les variables d'environnement à partir de votre terminal normal. Et ensuite collez toutes les variables d'environnement au début du fichier crontab.

1voto

Sundeep471 Points 553

Le premier coupable est votre fichier crontab, vous devez également mentionner le nom d'utilisateur avec lequel le script doit être exécuté, mieux vaut le garder comme root.

0,15,30,45 12-23 * * 3 root   /home/jchester/bin/opreminder.sh

et ensuite vous devriez utiliser le nom d'utilisateur de l'utilisateur de l'interface graphique à l'intérieur du script et le faire précéder de notify-send avec "sudo ou su" pour exécuter la commande en tant qu'utilisateur qui possède l'interface graphique

exemple :

su gnome_user_name -c 'notify-send "summary" "body"'

ou

sudo -u gnome_user_name notify-send "summary" "body"

gnome_user_name est le nom d'utilisateur de l'utilisateur qui a lancé la session GUI. c'est vous qui vous êtes connecté, et si vous voulez en faire un choix dynamique, vous pouvez l'obtenir à partir de

GNOME_USER=`ps -eo uname,cmd | grep gnome-session| head -1 | cut -d' ' -f1 `

exemple :

su $GNOME_USER -c 'notify-send "summary" "body"'

ou

sudo -u $GNOME_USER notify-send "summary" "body"

1voto

tanza Points 11

La façon dont le binaire récupère l'adresse du dbus semble avoir changé récemment. Sur Ubuntu 15.04 (Vivid Vervet) avec "notify-send 0.7.6", les deux variables suivantes sont nécessaires :

export HOME=/home/$notify_user
export DISPLAY=:0.0

L'instruction de 'krlmlr' est bien évaluée et définit l'adresse correcte, mais la boîte de dialogue ne s'affiche pas à partir d'une tâche cron.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X