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

16

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

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

#! / 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

Bien que les commandes mplayeret spd-saysoient exécutées correctement, ce notify-sendn'est pas le cas. J'ai également essayé de rediriger l'erreur vers 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?

Bloc noir
la source
juste pour vous assurer, avez-vous rendu le script exécutable? appartenant à root? que se passe-t-il lorsque vous exécutez le script à partir du terminal ou y mettez un script simple? Does /etc/crontaba la run-partsligne pour exécuter toutes les heures cronemplois dans le répertoire?
heemayl
Exécutable: oui, l'exécution du script va bien rien de mal dans le répertoire /etc/cron.hourly, vous ne savez pas comment vérifier cela? Est-ce dans les applications de démarrage? @heemayl
Black Block
1
Le /etc/crontabfichier a- t- il la ligne 17 * * * * root cd / && run-parts --report /etc/cron.hourly?
heemayl
1
Veuillez ne pas publier de captures d'écran de texte . Surtout lorsque ce texte est affiché dans une fenêtre de terminal transparente et comprend des couleurs gênantes.
terdon

Réponses:

24

Comme vous l'avez probablement vu dans les commentaires de votre question, les cronjobs dans /etc/cron.hourly(et les autres répertoires similaires) sont exécutés par run-parts. run-partsest un peu pointilleux sur les noms de fichiers. Par défaut, il n'exécute pas les fichiers dont les noms de fichiers contiennent autre chose que (tous ceux de ASCII)

  • lettres capitales
  • minuscules
  • chiffres
  • souligne
  • tirets ("signes moins")

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

Henning Kockerbeck
la source
1- Voici mes fichiers: mediafire.com/view/rg8r85xb7qw26zs/cron.hourly_017.png 2- Avez-vous essayé un script dans /etc/cron.hourly et travaillé avec vous?
Black Block
2
Je viens de tester un petit script qui vient d'écrire "Bonjour" dans un fichier dans / tmp, et cela a fonctionné sans problème. Au cas où, vous savez que les scripts /etc/cron.hourlyne sont pas nécessairement exécutés "à l'heure"? Si votre cronjob en /etc/crontaba 17 à la position des minutes, les scripts sont exécutés à 00:17, 01:17 et ainsi de suite. Et encore une fois au cas où, les autorisations du script permettent à l'utilisateur root de les exécuter?
Henning Kockerbeck
Yah mais mon script ne fonctionne jamais à aucun moment. et sur l'autorisation voir ici: mediafire.com/view/psnb4bflawdlyly/…
Black Block
C'est peut-être en fait un problème de permission. Je sais que les scripts de manière plus générale /etc/cron.d/ne doivent pas avoir d'autorisations d'écriture ou d'exécution pour "groupe" ou "autres". "propriétaire" a besoin d'une autorisation d'exécution, "groupe" et "autres" ne doivent avoir qu'une autorisation de lecture. Peut-être que cela s'applique /etc/cron.hourlyégalement, même si je n'ai pas testé cela.
Henning Kockerbeck
Ok alors j'ai changé l'autorisation pour mon fichier mediafire.com/view/s2lq63u7z54ohbo/… qui fait que le groupe qui est le groupe racine est en lecture seule et d'autres, donc est-ce que ça va poser des problèmes?
Black Block
5

Un problème est que vous essayez d'exécuter une application graphique ( notify-send) à partir de cron. Cela prend un peu de peaufinage. Vous devez définir XAUTHORITYet DISPLAYvariables dans le crontab afin qu'il puisse se connecter à votre session X en cours d'exécution et vous devez définir XDG_RUNTIME_DIRpour 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 les utiliser /etc/cron.hourly. Au lieu de cela, exécutez crontab -eet 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_DIRce qui est retourné lorsque vous echoles avez 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. Maintenant, votre script s'exécutera toutes les heures et devrait fonctionner comme prévu.

terdon
la source
C'est ce que vous voulez dire mediafire.com/view/ucjpvu8b41n3hue/… . cela n'a pas fonctionné pour moi.
Black Block
Je pense que si le problème était dans le send-send, alors pourquoi les autres commandes ne s'exécutaient pas aussi bien (comme mplayer)?
Black Block
@BlackBlock il y a plusieurs problèmes. i) notify-sendnécessite que les variables XAUTHORITYet DISPLAYsoient définies et ii) mplayernécessite que les variables XDG_RUNTIME_DIRsoient définies. Avez-vous essayé ma suggestion? Cela devrait résoudre les deux problèmes. Vous avez probablement également eu des problèmes de dénomination en raison de ce run-partsqui est expliqué dans l'autre réponse.
terdon
Alors pourquoi cela n'a pas fonctionné pour moi? je vais être fou! voir mon image dans le 1er commentaire sur votre réponse
Black Block
@BlackBlock non! Vous éditez /etc/crontab, ne faites pas ça. Vous voulez que cela soit exécuté en tant qu'utilisateur, pas en tant que root et ce fichier a un format différent de toute façon. Faites ce que j'ai dit dans ma réponse, courez crontab -eet ajoutez les lignes là-bas.
terdon
3

Un script se terminant par .shn'est pas exécuté dans le /etc/cron.hourlydossier:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=308911 Les
liens ou binaires à l'intérieur d'un répertoire géré par run-pars (comme /etc/cron.daily) ne fonctionneront pas si un point fait partie de leur nom.

renommer le script

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

ou mettez l'appel de script dans

/etc/crontab

ce qui permet la .shfin

rubo77
la source
1

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

ajoutez votre code au fichier abc et enregistrez-le (pour votre besoin) (ce devrait être la commande bash)

utilisation

sudo chmod +x abc

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 enregistrez-la.

alors il fonctionnera correctement.

Aruna D Mahagamage
la source