Qu'est-ce que le "répertoire de travail" lorsque cron exécute un travail?

171

J'ai un script qui fonctionne lorsque je l'exécute à partir de la ligne de commande, mais lorsque je le planifie avec des cronerreurs, il ne parvient pas à trouver des fichiers ou des commandes. Ma question est double:

  1. 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?

  2. 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 mailmessage 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.txtmais 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?

Professionnel amateur
la source

Réponses:

159

Ajoutez cd /home/xxxx/Documents/Scripts/si vous voulez que votre travail soit exécuté dans ce répertoire. Il n'y a aucune raison pour que cron change dans ce répertoire particulier. Cron exécute vos commandes dans votre répertoire personnel.

En ce qui concerne ssmtp, il se peut que ce ne soit pas votre défaut PATH. Le chemin par défaut de Cron dépend de l'implémentation, alors consultez votre page de manuel, mais il ssmtpest fort probable /usr/sbinqu'il ne se trouve pas dans votre répertoire par défaut PATH, mais uniquement celui de root.

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh
Gilles
la source
@Giles - Merci, aurais-tu cronle sien PATHou puis-je vérifier mon utilisateur PATH? J'ai configuré ssmtp pour avoir le sien useret l' wheelautorisation, pensant que cela permettrait à quiconque de l'utiliser (y compris cron). Si cela peut aider, je suis sur CENTOS 6.2
ProfessionalAmateur
3
@ProfessionalAmateur Votre problème n'est pas que vous n'êtes pas autorisé à utiliser ssmtp, mais que votre travail cron ne trouve aucun exécutable appelé ssmtpcar il ne fait pas partie de votre PATH. «Votre utilisateur PATH» 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 une PATH=…ligne dans votre crontab.
Gilles
Je devais aussi ajouter MAILTO='[email protected] 'pour que cela fonctionne avec la configuration de PATH. Wierd mais cela a fonctionné pour moi.
Mac
Pour smpp on peut utiliser; ´which ssmtp´ ...
Fredrick Gauss
@FredrickGauss Make thattype ssmtp
Gilles
20

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

cd "$(dirname "$0")";
Hugo
la source
14

Pour répondre à la question 1: si vous exécutez en crontab -etant 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 mktempvous 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:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
mail_msg=`/bin/mktemp`
/bin/sed "s/IPADDR/$vIP_ADDR/g" /home/xxxx/Documents/Scripts/template.txt > $mailmsg
/path/to/ssmtp [email protected] < $mailmsg
/bin/rm $mailmsg
Bram
la source
7

cronexé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 cdvotre script pour accéder à cet emplacement.

ssmtpest probablement pas dans cronPATH 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 de ssmtpvotre script ou définir explicitement PATH dans a) votre fichier crontab, qui sera disponible pour tous vos scripts, ou b) dans chaque script.

D_Bye
la source
3

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.

jippie
la source
1

Le répertoire de travail par défaut pour l' cronexécution du travail est généralement le répertoire de base /home/your-user-name.

L'adoption de @Kusalananda est un excellent commentaire.

Les gens intelligents aident les autres
la source
1
Non, cela dépend de l'endroit où le système conserve les répertoires de base. /homeest loin d'être universel.
Kusalananda
1
@Kusalananda La norme LSB dit /home.
user259412
1
@peterh Eh bien, macOS utilise /Userset 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 /varou ailleurs.
Kusalananda
1
@ Kusalananda C'est vrai.
user259412
Merci, vous êtes la seule personne à avoir répondu à cette question :)
OwN
0

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.

* * * * * echo $PATH > /tmp/lolcronjobs

Dans mon cas, Ubuntu utilise par défaut uniquement /usr/bin:/bince qui cause quelques problèmes.

mschuett
la source