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

0voto

Keval Bhatt Points 101

Mieux vaut s'appuyer sur dbus-session il doit être exécuté pour tous les systèmes dans lesquels les DBUS_SESSION_BUS_ADDRESS est présent.

Créer 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 '\0' '\n' | grep DBUS_SESSION_BUS_ADDRESS | cut -d '=' -f2-`
export DISPLAY=:0

notify-send "It works!"

Rendez-le exécutable :

$ chmod +x ~/notify.sh

Ajoutez-le à la crontab :

* * * * * $HOME/notify.sh

0voto

Gen.Stack Points 121

Problème causé par l'appel python3 dans la crontab avec UTF-8 locale.

TL;DR : appel du préfixe dans la crontab avec la locale comme dans :

*/5 * * * * LC_ALL=en_US.utf-8 LANG=en_US.utf-8 ~/.local/bin/watson-notify

Voir aussi clic et python3 :

Traceback (most recent call last):
  File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/watson/__main__.py", line 6, in <module>
    cli.cli()
  File "/usr/lib/python3/dist-packages/click/core.py", line 759, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/click/core.py", line 693, in main
    _verify_python3_env()
  File "/usr/lib/python3/dist-packages/click/_unicodefun.py", line 123, in _verify_python3_env
    'for mitigation steps.' + extra)
RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment.  Consult http://click.pocoo.org/python3/ for mitigation steps.

This system supports the C.UTF-8 locale which is recommended.
You might be able to resolve your issue by exporting the
following environment variables:

    export LC_ALL=C.UTF-8
    export LANG=C.UTF-8

0voto

MattyG Points 5126

Pour toutes les crontab script qui utilisent libnotify, j'utilise ceci :

notify_user() {
    local user=$(whoami)
    notify-send -u normal -t 4000 "System Backup" "Starting backup"
}

notify_user # and do other stuff

Cela fonctionne même si j'utilise cron en mode root.

0voto

Bruno Points 101

Tout ce dont vous avez besoin est le X_user et le X_userid. Remplacez-les dans la commande ci-dessous.

Solution avec systemd

/etc/systemd/system/opreminder.service #Fichier de service

[Unit]
Descrption=some service to run

[Service]
User=[X_user]
ExecStart=/home/jchester/bin/opreminder.sh

/etc/systemd/system/opreminder.timer #fichiertimer

[Unit]
Description=Some desc

[Timer]
OnCalendar=0,15,30,45 12-23 * * 3 

[Install]
WantedBy=list.timer.target

/home/jchester/bin/opreminder.sh #Le script

#!/usr/bin/env bash

sudo -u [X_user] DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/[X_userid]/bus notify-send 'Hello world!' 'This is an example notification.'

Il n'est pas nécessaire d'utiliser sudo -u si le fichier de service est déjà configuré avec l'utilisateur prévu.

Source : https://wiki.archlinux.org/index.php/Desktop_notifications#Usage_in_programming

0voto

Eduard Semsch Points 1

Cela le fait fonctionner sur 19.10 :

eval "export $(pgrep -u $LOGNAME gnome-session | head -n 1 | xargs -I{} cat /proc/{}/environ | egrep -z DBUS_SESSION_BUS_ADDRESS)";

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