Voici le contenu de mon fichier crontab:
Shell=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="[email protected]"
*/5 * * * * sh /robot/1/master.sh >/dev/null 2>&1
*/5 * * * * sh /robot/2/master.sh >/dev/null 2>&1
*/5 * * * * sh /robot/3/master.sh
*/5 * * * * sh /robot/4/master.sh >/dev/null 2>&1
*/5 * * * * sh /robot/5/master.sh >/dev/null 2>&1
C'est l'erreur qui continue de s'afficher dans /var/log/cron
lorsqu'il essaie de s'exécuter:
crond[669]: (sh) ERROR (getpwnam() failed)
Si j'exécute l'un de ces fichiers manuellement, ils fonctionnent sans aucun problème.
Quel est le problème avec le fichier crontab?
Cela m'étonne que personne n'ait la bonne réponse à cela. Aujourd'hui, j'ai fait face exactement au même problème et Google n'a pas aidé.
Après 2 heures, j'ai constaté que lors du placement d'un fichier dans /etc/cron.d, la ligne de programmation doit contenir une option supplémentaire .....
Je l'utilise toujours pour ma crontab -e
# Minute Hour Day of Month Month Day of Week Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) /my/fancy/script.sh
Il contient donc 6 éléments.
Lorsque vous placez ceci dans un fichier à l'intérieur de /etc/cron.d, le cron a besoin d'une option supplémentaire, étant l'utilisateur pour exécuter votre fantaisie/script.
# Minute Hour Day of Month Month Day of Week Who Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) root /my/fancy/script.sh
Ceci est documenté dans man crontab (5). Par exemple https://linux.die.net/man/5/crontab . Ça dit:
Travaux dans /etc/cron.d/
Les tâches dans cron.d sont des tâches système, qui sont généralement utilisées pour plusieurs utilisateurs. C'est la raison pour laquelle le nom de l'utilisateur est nécessaire. MAILTO sur la première ligne est facultative.
réponse simple sur votre crontab, vous devez spécifier l'UTILISATEUR pour exécuter la commande
exemple pour fonctionner comme ROOT est: -
0,10,20,30,40,50 * * * * root/path_to_script/script_name
ou pour exécuter en tant qu'utilisateur FRED
0,10,20,30,40,50 * * * * fred/path_to_script/script_name
par défaut sans USER spécifié est de s'exécuter en tant qu'utilisateur CRON et cet utilisateur ne serait pas autorisé à exécuter le script
La sixième position est réservée à nom d'utilisateur exécutant le travail. Vous avez spécifié un utilisateur appelé sh
qui n'est probablement pas présent sur la machine.
Il n'y a rien de mal avec le fichier crontab (tant que par "mon" crontab, vous voulez dire qu'il s'agit d'un utilisateur crontab plutôt que d'un système crontab; sinon, voir autre réponse ).
D'un autre côté, quelque chose ne va pas avec le service d'annuaire de votre système - tel que configuré, sous Linux, avec nsswitch.conf
. Vous utilisez peut-être un magasin LDAP authentifié par Kerberos, et votre démon cron n'a pas de jeton Kerberos pour s'y connecter (ou est mis en sandbox, comme avec SELinux, pour ne pas avoir accès au réseau); c'est peut-être un magasin de fichiers qui n'est pas lisible par l'utilisateur dont la crontab est exécutée; peut-être une autre chose étrange et intéressante se passe.
getpwnam()
est un appel de bibliothèque C qui effectue une recherche du nom de l'utilisateur actuellement connecté. Si votre Shell était bash , il retomberait sous le nom de I have no name!
- donc cette erreur signifie votre sh
la mise en œuvre est quelque chose de différent. (Si vous voulez exécuter vos scripts avec bash, utilisez bash
, pas sh
).
Nous pouvons créer des emplois cron pour le système ainsi que pour les particuliers. La crontab dans /etc/crontab
Spécifiquement utilisée pour les tâches cron du système. Vous devez donc spécifier la commande cronjob exécutée par qui. Dans la question, le nom d'utilisateur n'est pas spécifié. Par conséquent, la ERROR (getpwnam() failed)
se produit. Vous pouvez créer des tâches cron spécifiques à l'utilisateur dans /var/spool/cron/username
NOTE :: Les tâches Cron sont très utiles mais désastreuses en cas d'échecs!