Pourquoi mon travail cron.d par minute ne s'exécute-t-il pas?

33

J'ai jeté un tas de fléchettes en essayant de faire exécuter chaque minute un script en python. J'ai donc pensé simplifier le processus pour qu'il ne fasse que "la chose la plus simple qui puisse fonctionner" une fois par minute (je suis sous debian / testing).

J'ai créé un fichier d'une seule ligne dans /etc/cron.d/perminute:

* * * * * /bin/touch /home/me/ding_dong

Il est la propriété de root et de l'exécutable (je ne sais pas si cela importe). Et puis j'ai fait:

sudo service cron reload

Et puis asseyez-vous et commencez à courir ls -ltrencore et encore dans mon répertoire personnel ( /home/me). Mais mon fichier ding_dong ne se présente jamais. Je sais que si je fais sudo /bin/touch /home/me/ding_dongça, ça se voit tout de suite.

Manque évidemment quelque chose de stupide ici.

Travis Griggs
la source
3
Recharger le service démon cron afin d'appliquer une modification dans cron.d est généralement inutile, car il réanalyse le répertoire des fichiers nouveaux et mis à jour toutes les minutes.
Josip Rodin

Réponses:

45

Lors de l'ajout d'une configuration cron dans /etc/cron.d/ou dans, /etc/crontabvous devez ajouter le nom d'utilisateur dans quel contexte la commande doit être exécutée, dans votre exemple.

* * * * * root /bin/touch /home/me/ding_dong

Et juste un conseil de ma part: vous n'avez pas à recommencer à courir ls -ltr, utilisez-le watch -n 5 "ls -ltr"et la commande sera exécutée toutes les 5 secondes (ou toute autre valeur en remplaçant 5 par ce que vous voulez).

noggerl
la source
9
Cela m'a permis d'aller dans la bonne direction. C'était un moment de chute. Je l'ai réparé et pourtant cela ne fonctionnait toujours pas. Après avoir lu man cronun peu plus lentement et porté une attention particulière aux DEBIAN specificsections, j'ai remarqué que les fichiers ne doivent PAS être en groupe ou inscriptibles. Ce que j'avais activé dans ma frustration à un moment donné.
Travis Griggs
Ne pourriez-vous pas aussi simplement changer le propriétaire du script en root?
Geremia
Cette ligne spécifique m'a aidé. De man cron: De plus, dans Debian, cron lit les fichiers du répertoire /etc/cron.d. cron traite les fichiers dans /etc/cron.d de la même manière que le fichier / etc / crontab (ils suivent le format spécial de ce fichier, c’est-à-dire qu’ils incluent le champ utilisateur ). Cependant, ils sont indépendants de / etc / crontab: ils n'en héritent pas, par exemple, des paramètres de variable d'environnement. Cette modification est spécifique à Debian (voir la note sous Spécifique à Debian ci-dessous).
harperville
man 8 cron (sur Debian) indique également que les fichiers de /etc/cron.d/ ne peuvent contenir que des caractères alphanumériques, '-' et '_'. Plus précisément, pas de points.
mpartel
3

Pour créer un nouveau crontravail, vous devez l'exécuter en crontab -etant qu'utilisateur de votre choix. Ajoutez ensuite la ligne appropriée dans la fenêtre de l'éditeur qui apparaît:

* * * * * /bin/touch /home/me/ding_dong

La façon dont vous le faites nécessite un format différent et n’est vraiment pas une bonne idée de toute façon. Les crontabs /etc/cron.dont un format légèrement différent, ils nécessitent un nom d’utilisateur pour être exécutés. Par exemple:

* * * * * USERNAME /bin/touch /home/me/ding_dong

Une bonne astuce (suggérée par @VogonPoetLaureate) consiste à capturer l'erreur standard de vos tâches cron, ce qui peut aider à les déboguer. Par exemple:

* * * * * /bin/touch /home/me/ding_dong 2>/tmp/error
terdon
la source
6
Il n'y a absolument aucune raison de dire que cron.d n'est "pas une bonne idée". Le démon cron enverra le résultat cron.d stderr au nom d'utilisateur, et si vous souhaitez le rediriger vers une autre adresse électronique, la variable MAILTO est disponible.
Josip Rodin
@JosipRodin Ce n'est pas une bonne idée pour les choses qui ne sont pas gérées par root et qui sont configurées par vous. Cela a du sens pour un administrateur système sur un système multi-utilisateur mais sur votre propre machine, il est plus simple de tout avoir dans votre propre crontab, il n’ya donc qu’un seul endroit pour vérifier et crontab -lrépertorier tous vos travaux cron.
terdon
Cela suppose qu'il ne s'agit en réalité que d'un travail personnel personnel, ce que l'OP n'a pas vraiment clarifié. De manière générale, il existe de nombreuses applications pour les travaux utilisateur créés sans privilèges configurés via cron.d, tels que les conserver tous au même endroit, malgré le fait que vous disposiez bien utilisateurs de services séquestrés, le déploiement automatisé est plus facile, etc.
Josip Rodin
@ JosipRodin absolument. J'ai supposé un système personnel parce que i) les systèmes d'entreprise sont hors sujet ici et ii) la question suggérait un utilisateur non expert.
terdon
D'accord, je suppose que je n'ai plus lu cela à cause de la confusion qui règne entre superuser et serverfault et les sites unix SE :)
Josip Rodin
2

Une erreur possible ici est la création d’ un fichier simple ligne . De la documentation Ubuntu :

... line a cinq champs heure et date, suivis d'une commande, suivis d'un caractère de nouvelle ligne .

Par exemple, cette façon de créer ne fonctionne pas:

printf "* * * * * /bin/touch /home/me/ding_dong" > /etc/cron.d/ding_dong
okoloBasii
la source