web-dev-qa-db-fra.com

"getpwnam () a échoué" dans / bin / sh uniquement lorsqu'il est appelé depuis cron

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?

22
Andrew

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.

74
hetOrakel

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

2
Mark Baiter

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.

1
Yuri

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).

0
Charles Duffy

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!

0
Vimal Surendran