J'ai un script qui fonctionne lorsque je l'exécute à partir de la ligne de commande, mais lorsque je le planifie avec des cron
erreurs, il ne parvient pas à trouver des fichiers ou des commandes. Ma question est double:
Lorsque je planifie un travail cron avec
crontab -e
, utilise -t-il mon ID utilisateur comme base de ses autorisations? Ou utilise-t-il un identifiant d'utilisateur cron d'une certaine sorte et ses autorisations associées?Lorsqu'un travail cron est lancé, quel est le répertoire de travail? Est-ce le répertoire dans lequel je spécifie le script à exécuter ou un autre répertoire?
Voici mon travail cron:
15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh
Voici le script actuel:
vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp [email protected] < emailmsg.txt
Voici les erreurs que je reçois lorsque je visualise le mail
message produit par cron
:
sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found
Il ne peut pas trouver le fichier template.txt
mais il réside dans le même répertoire que le script. Il ne peut pas non plus fonctionner ssmtp
, mais je peux en tant qu'utilisateur. Qu'est-ce qui me manque pour que cela fonctionne correctement?
la source
cron
le sienPATH
ou puis-je vérifier mon utilisateurPATH
? J'ai configuré ssmtp pour avoir le sienuser
et l'wheel
autorisation, pensant que cela permettrait à quiconque de l'utiliser (y compris cron). Si cela peut aider, je suis sur CENTOS 6.2ssmtp
, mais que votre travail cron ne trouve aucun exécutable appeléssmtp
car il ne fait pas partie de votrePATH
. «Votre utilisateurPATH
» n'existe pas . il s'agit d'un paramètre par processus, pas d'un paramètre par utilisateur. Vous pouvez définir le chemin de tous vos travaux cron en mettant unePATH=…
ligne dans votre crontab.´which ssmtp´ ...
type ssmtp
Si votre travail cron est un script bash, les éléments suivants vont CD sur l'emplacement de votre script (en supposant que vous utilisez un chemin absolu dans votre définition de cron):
la source
Pour répondre à la question 1: si vous exécutez en
crontab -e
tant que votre propre utilisateur, les travaux seront planifiés dans la crontab de cet utilisateur et seront donc exécutés avec les autorisations de cet utilisateur.Cependant, vous devez considérer que les travaux seront exécutés dans un shell non interactif, ce qui signifie que le $ PATH peut être différent de celui que vous avez lors de l'exécution du script à partir de la ligne de commande.
Il est préférable de toujours utiliser des chemins complets dans les scripts, surtout si vous prévoyez de les planifier via / cron, etc.
Je vous recommanderais également d’utiliser des chemins complets vers tous les fichiers pour éviter exactement les problèmes que vous voyez.
Pour éviter les situations de concurrence et d'autres problèmes de sécurité, vous devez également
mktemp
vous assurer que le fichier que vous lisez n'est pas modifié par quoi que ce soit en dehors de votre script.Donc, je changerais le script à quelque chose comme:
la source
cron
exécute les tâches planifiées de chaque utilisateur en tant que cet utilisateur. Cela devrait être suffisant pour que nous sachions qu'il exécute vos scripts par rapport à votre répertoire personnel.Si vous avez besoin que celui-ci soit exécuté à partir d'un autre emplacement, utilisez simplement
cd
votre script pour accéder à cet emplacement.ssmtp
est probablement pas danscron
PATH par défaut (il est conçu pour être très étroit par nature sur la plupart des plateformes). Vous pouvez spécifier le chemin complet dessmtp
votre script ou définir explicitement PATH dans a) votre fichier crontab, qui sera disponible pour tous vos scripts, ou b) dans chaque script.la source
Consultez ce fil pour savoir comment trouver facilement l’environnement de cron, c’est beaucoup moins que ce à quoi vous êtes habitué dans un shell interactif. Le mieux est de supposer que rien n'a été défini et de le définir explicitement vous-même.
la source
Le répertoire de travail par défaut pour l'
cron
exécution du travail est généralement le répertoire de base/home/your-user-name
.L'adoption de @Kusalananda est un excellent commentaire.
la source
/home
est loin d'être universel./home
./Users
et les Unices historiques utilisent/usr
, et même sous Linux, le répertoire de base d'un utilisateur système peut se trouver quelque part sous/var
ou ailleurs.Certaines personnes l'ont laissé entendre ou ont un lien avec ce dernier, mais le meilleur moyen de le savoir, car je ne le trouve pas dans la documentation man de ma distribution, est simplement de l'ajouter à un cron.
Dans mon cas, Ubuntu utilise par défaut uniquement
/usr/bin:/bin
ce qui cause quelques problèmes.la source