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

45voto

krlmlr Points 3122

Les choses semblent être différentes sur 13.04, au moins dans Gnome Shell.

D'abord, c'est ce que env imprime lorsqu'il est exécuté depuis l'utilisateur zzyxy (pas celui de root) :

HOME=/home/zzyxy
LOGNAME=zzyxy
PATH=/usr/bin:/bin
XDG_RUNTIME_DIR=/run/user/zzyxy
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/zzyxy

Pour obtenir notify-send pour fonctionner, il semble nécessaire de définir l'option DBUS_SESSION_BUS_ADDRESS variable d'environnement, conformément à Commentaire de DahitiF sur ubuntuforums.org. Ajoutez simplement le texte suivant à votre description de poste :

eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";

Il ne semble pas être nécessaire de définir DISPLAY .

30voto

Absim Points 1

Commande notify-send n'afficherait pas le message sur votre écran lorsqu'il est lancé par cron. Il suffit d'ajouter l'affichage de la cible en haut de votre script, par exemple :

export DISPLAY=:0

22voto

Jehof Points 368

Les commandes doivent faire référence à leur emplacement. Ainsi, notify-send doit être /usr/bin/notify-send

Toutes les commandes doivent avoir leur chemin complet.

Utilisez le whereis notify-send pour voir où vos commandes " vivent ".

12voto

Mr. Goferito Points 218

J'utilise i3 sur Ubuntu 18.04 et 20.04. Ma façon de résoudre ce problème est la suivante :

* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"

7voto

nmax Points 331

Pour Ubuntu 14.04 au moins, Réponse de klrmr ci-dessus est la bonne réponse. Il ne semble pas nécessaire de définir DISPLAY ou d'articuler les chemins complets pour notify-send ou tout ce qui se trouve normalement dans $PATH.

Voici un cron script que j'utilise pour arrêter une machine virtuelle lorsque l'état de la batterie d'un ordinateur portable devient trop faible. La ligne définissant DBUS_SESSION_BUS_ADDRESS dans la réponse de klrmr ci-dessus est la modification qui a finalement permis aux avertissements de fonctionner correctement.

#!/bin/bash

# if virtual machine is running, monitor power consumption
if pgrep -x vmware-vmx; then
  bat_path="/sys/class/power_supply/BAT0/"
  if [ -e "$bat_path" ]; then
    bat_status=$(cat $bat_path/status)
    if [ "$bat_status" == "Discharging" ]; then
      bat_current=$(cat $bat_path/capacity)
      # halt vm if critical; notify if low
      if [ "$bat_current" -lt 10 ]; then
        /path/to/vm/shutdown/script
        echo "$( date +%Y.%m.%d_%T )" >> "/home/user/Desktop/VM Halt Low Battery"
        elif [ "$bat_current" -lt 15 ]; then
            eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";
            notify-send -i "/usr/share/icons/ubuntu-mono-light/status/24/battery-caution.svg"  "Virtual machine will halt when battery falls below 10% charge."
      fi
    fi
  fi
fi

exit 0

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