web-dev-qa-db-fra.com

Pourquoi mettre un script dans /etc/cron.hourly ne fonctionne pas?

J'ai mis un script exécutable dans /etc/cron.hourly, mais ce script ne s'exécutait pas toutes les heures. En fait, il ne s'exécute jamais.

Voici le script (Hour-sound) que j'ai créé:

 #!/bin/bash 
 mplayer ~/Musique/sfx_msg-highlight.wv &>/dev/null & 
 spd-say -r -50 -p 50 -t male3 "Le temps est maintenant $ (date +"% l% p ")" 
 notify-send "C'est:" "$ (date +"% l% p ") maintenant." -i ~/Images/"premier tee.png" -t 5000 

Mon crontab est:

DISPLAY=":0.0"
XAUTHORITY="/home/naruto/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /home/naruto/Hour-sound.sh

Alors que les commandes mplayer et spd-say sont exécutées correctement, le notify-send ne l’est pas. J'ai aussi essayé de rediriger l'erreur dans un fichier:

0 * * * * /home/naruto/Hour-sound.sh 2>/tmp/error

Mais cela n'a montré aucune sortie. Qu'est-ce que je fais mal?

13
Black Block

Comme vous l'avez probablement constaté dans les commentaires sur votre question, les tâches cron de /etc/cron.hourly (et les autres répertoires similaires) sont exécutées par run-parts. run-parts est un peu difficile en ce qui concerne les noms de fichiers. Par défaut, il n’exécute pas les fichiers dont le nom contient autre chose que (tous ceux en ASCII)

  • lettres capitales
  • minuscules
  • chiffres
  • soulignés
  • tirets ("signes moins")

Donc, si votre script a un nom de fichier, par exemple "myscript.sh", il est simplement ignoré, car run-parts n'aime pas le point.

21
Henning Kockerbeck

Un problème est que vous essayez de lancer une application graphique (notify-send) à partir de cron. Cela prend un peu de peaufinage. Vous devez définir les variables XAUTHORITYet DISPLAYdans la liste de contrôle afin de pouvoir se connecter à votre session X en cours d'exécution. Vous devez également définir XDG_RUNTIME_DIR pour qu'il puisse se connecter à votre session pulseaudio. Malheureusement, ceux-ci doivent être définis dans la crontab elle-même, vous ne pouvez donc pas utiliser /etc/cron.hourly. À la place, exécutez crontab -e et ajoutez ces lignes:

DISPLAY=":0.0"
XAUTHORITY="/home/YOURUSERNAME/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /path/to/script.sh 

Modifiez la valeur de XDG_RUNTIME_DIR par tout ce qui est renvoyé lorsque vous avez echodepuis un terminal. Sur mon système, c'est:

$ echo $XDG_RUNTIME_DIR
/run/user/1001

Ce sera probablement le même sur le vôtre, mais vérifiez d'abord. Votre script s’exécutera toutes les heures et devrait fonctionner comme prévu.

5
terdon

Un script se terminant par .sh n'est pas exécuté dans le dossier /etc/cron.hourly:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=308911
Les liens ou les fichiers binaires dans un répertoire géré par run-pars (comme /etc/cron.daily) ne fonctionneront pas si une période est une partie de leur nom.

renommer le script

mv /etc/cron.hourly/Hour-sound.sh /etc/cron.hourly/Hour-sound

ou mettre l'appel de script dans

/etc/crontab

qui permet la fin du .sh

3
rubo77

N'utilisez pas de script avec extension (abc.sh) et ajoutez votre lieu de besoin. (cron.heures).

ajoutez votre code dans un fichier abc et sauvegardez-le (pour votre besoin) (il devrait s'agir de la commande bash)

utilisation

Sudo chmod +x abc

commande pour créer un fichier exécutable.

edit etc/cronrtab file

il y a quelques lignes prédéfinies. Modifiez votre ligne de minutes en heures et sauvegardez-la.

alors il fonctionnera correctement.

1
Aruna D Mahagamage