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?
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)
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.
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 XAUTHORITY
et DISPLAY
dans 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 echo
depuis 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.
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
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.