Notify-send ne fonctionne pas à partir de crontab

36

J'ai créé un script qui devrait m'avertir lorsqu'un nouveau chapitre du manga est en cours de lecture. J'ai utilisé la commande notify-send pour le faire. Le programme fonctionne lorsque j'essaie de l'exécuter dans un terminal. La notification est affichée. Cependant, lorsque j'ai placé ceci dans ma crontab, la notification ne s'affiche pas. Je suis à peu près sûr que le programme est en cours d'exécution depuis que je l'ai créé pour créer un fichier pour moi. Le fichier a été créé, mais la notification ne s'affiche pas.

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
    
posée user158335 22.05.2013 - 13:35
la source

12 réponses

17

Les commandes doivent référencer leur emplacement. Donc, notify-send doit être /usr/bin/notify-send

Toutes les commandes doivent avoir leur chemin complet.

Utilisez la commande whereis notify-send pour voir où "vivent" vos commandes

    
réponse donnée Meer Borg 22.05.2013 - 14:04
la source
26

Les choses semblent être différentes le 13.04, du moins dans Gnome Shell.

Tout d’abord, c’est ce que env imprime lorsqu’il est exécuté à partir du travail cron de l’utilisateur zzyxy (non 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 que notify-send fonctionne, il semble nécessaire de définir la variable d'environnement DBUS_SESSION_BUS_ADDRESS , comme indiqué dans Commentaire de DahitiF sur ubuntuforums.org. Ajoutez simplement ce qui suit à la description de votre travail actuel:

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

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

    
réponse donnée krlmlr 17.09.2013 - 10:29
la source
18

La commande notify-send n'affichera pas le message sur votre écran si elle est lancée par cron. Ajoutez simplement l'affichage cible en haut de votre script, par exemple:

export DISPLAY=:0
    
réponse donnée Martin Höger 27.05.2014 - 08:23
la source
3

Pour Ubuntu 14.04 au moins, la réponse de klrmr ci-dessus est la bonne réponse. Il ne semble pas nécessaire de définir DISPLAY ou d’articuler des chemins complets pour notify-send ou quoi que ce soit normalement dans $ PATH.

Voici un script cron que j'utilise pour arrêter une machine virtuelle lorsque l'état de la batterie d'un ordinateur portable devient trop faible. Le paramètre de ligne 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
    
réponse donnée nmax 21.10.2014 - 02:58
la source
2

Dans mon cas avec ubuntu 16.04, tout chemin explicite était requis, je résous le problème en ajoutant

DISPLAY=:0

aux premières lignes de la crontab, avant l’appel, notifier-envoyer.

    
réponse donnée Raul R. 26.10.2017 - 23:15
la source
1

Le premier coupable est votre fichier crontab. Vous devez également mentionner le nom d'utilisateur avec lequel le script doit être exécuté. Il est préférable de le conserver en tant que root

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

et vous devez ensuite utiliser le nom d'utilisateur de l'utilisateur graphique dans le script et le préfixer de façon à notifier-envoyer avec "sudo ou su" pour exécuter la commande en tant qu'utilisateur propriétaire 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 démarré la session graphique c’est vous qui vous êtes connecté, et si vous voulez en faire une sélection dynamique, vous pouvez l’obtenir 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"
    
réponse donnée Sundeep Borra 26.07.2013 - 09:38
la source
1

La façon dont le binaire récupère l'adresse 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' évalue correctement et définit l'adresse correcte, mais la boîte de dialogue ne s'ouvre pas à partir d'un travail cron.

    
réponse donnée tanza 22.06.2015 - 11:36
la source
0

J'utilise i3 sur Ubuntu 18.04. Ma façon de résoudre ceci est:

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

    
réponse donnée 03.12.2018 - 18:18
la source
0

Si votre script dans crontab est exécuté en tant que root, les réponses ci-dessus ne fonctionneront probablement pas. Essayez cette fonction qui me convient parfaitement dans 16.04:

notify_all() {
    local title=$1
    local msg=$2

    who | awk '{print $1, $NF}' | tr -d "()" |
    while read u d; do
        id=$(id -u $u)
        . /run/user/$id/dbus-session
        export DBUS_SESSION_BUS_ADDRESS
        export DISPLAY=$d
        su $u -c "/usr/bin/notify-send '$title' '$msg'"
    done 
}

(Source: lien )

    
réponse donnée mivk 12.02.2017 - 11:37
la source
0

Mieux vaut compter sur dbus-session process, il devrait être en cours d'exécution pour tous les systèmes où DBUS_SESSION_BUS_ADDRESS est présent.

Créez un script:

#!/bin/bash
# notify.sh

environs='pidof dbus-daemon | tr ' ' '\n' | awk '{printf "/proc/%s/environ ", $1}''
export DBUS_SESSION_BUS_ADDRESS='cat $environs 2>/dev/null | tr '
$ chmod +x ~/notify.sh
' '\n' | grep DBUS_SESSION_BUS_ADDRESS | cut -d '=' -f2-' export DISPLAY=:0 notify-send "It works!"

Rendez-le exécutable:

* * * * * $HOME/notify.sh

Ajoutez-le à la crontab:

#!/bin/bash
# notify.sh

environs='pidof dbus-daemon | tr ' ' '\n' | awk '{printf "/proc/%s/environ ", $1}''
export DBUS_SESSION_BUS_ADDRESS='cat $environs 2>/dev/null | tr '
$ chmod +x ~/notify.sh
' '\n' | grep DBUS_SESSION_BUS_ADDRESS | cut -d '=' -f2-' export DISPLAY=:0 notify-send "It works!"
    
réponse donnée denis.peplin 22.09.2017 - 11:52
la source
0

Cela a pris une éternité pour faire fonctionner ubuntu 15.10. Il a fallu ajouter une source pour que les utilisateurs obtiennent leur env. mon affichage était: 1 pour une raison également. Utilisation du pid des premiers résultats de gnome-session pour la recherche 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)"
    
réponse donnée Tristik 02.02.2016 - 09:53
la source
0

Je viens de faire en sorte que cela fonctionne avec le bureau cannelle sur Ubuntu 15.10, en utilisant la recette suivante:

if [ ! -v DBUS_SESSION_BUS_ADDRESS ]; then
  pid=$(pgrep -u $LOGNAME cinnamon-sessio)
  eval "export $(\grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ)"
fi
notify-send "$RESUME" "$INFO"

Le truc était de réaliser que la "session cannelle" est trop longue pour que pgrep puisse trouver:

$ pgrep -u $LOGNAME cinnamon-session
$ pgrep -u $LOGNAME cinnamon
30789
30917
30965
30981
31039
31335
$ ps -a | \grep cinnamon
30789 tty2     00:00:00 cinnamon-sessio
30917 tty2     00:00:02 cinnamon-settin
30965 tty2     00:00:00 cinnamon-launch
30981 tty2     00:04:15 cinnamon
31039 tty2     00:00:00 cinnamon-killer
31335 tty2     00:00:00 cinnamon-screen
$ ps a | \grep cinnamon
 4263 pts/1    S+     0:00 grep cinnamon
30779 tty2     Ssl+   0:00 /usr/lib/gdm/gdm-x-session --run-script cinnamon-session-cinnamon
30789 tty2     Sl+    0:00 cinnamon-session --session cinnamon
30917 tty2     Sl+    0:02 /usr/lib/x86_64-linux-gnu/cinnamon-settings-daemon/cinnamon-settings-daemon
30965 tty2     Sl+    0:00 /usr/bin/python2 /usr/bin/cinnamon-launcher
30970 tty2     Sl+    0:00 /usr/lib/x86_64-linux-gnu/cinnamon-settings-daemon/csd-printer
30981 tty2     Sl+    4:16 cinnamon --replace
31039 tty2     Sl+    0:00 /usr/bin/python2 /usr/bin/cinnamon-killer-daemon
31335 tty2     Sl+    0:00 cinnamon-screensaver
$ pgrep -u $LOGNAME cinnamon-sessio
30789

J'ai également dû utiliser \ grep car mon grep est associé à un alias

$ alias grep
alias grep='grep -n --color=always'
    
réponse donnée John Frankland 03.02.2016 - 14:50
la source

Lire d'autres questions sur les étiquettes