Cron n'utilise pas le chemin de l'utilisateur dont elle est la crontab et a le sien. Elle peut facilement être modifiée en ajoutant PATH=/foo/barau début de la crontab, et la solution classique consiste à toujours utiliser des chemins absolus pour les commandes exécutées par cron, mais où est défini le PATH par défaut de cron?
J'ai créé une crontab avec le contenu suivant sur mon système Arch (cronie 1.5.1-1) et également testé sur une boîte Ubuntu 16.04.3 LTS avec les mêmes résultats:
$ crontab -l
* * * * * echo "$PATH" > /home/terdon/fff
C'est imprimé:
$ cat fff
/usr/bin:/bin
Mais pourquoi? Le chemin par défaut du système est défini dans /etc/profile, mais cela inclut d'autres répertoires:
$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
Il n'y a rien d'autre de pertinent dans /etc/environmentni /etc/profile.dles autres fichiers que je pensais susceptibles d'être lus par cron:
$ grep PATH= /etc/profile.d/* /etc/environment
/etc/profile.d/jre.sh:export PATH=${PATH}:/usr/lib/jvm/default/bin
/etc/profile.d/mozilla-common.sh:export MOZ_PLUGIN_PATH="/usr/lib/mozilla/plugins"
/etc/profile.d/perlbin.sh:[ -d /usr/bin/site_perl ] && PATH=$PATH:/usr/bin/site_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/site_perl/bin ] && PATH=$PATH:/usr/lib/perl5/site_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/vendor_perl ] && PATH=$PATH:/usr/bin/vendor_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/vendor_perl/bin ] && PATH=$PATH:/usr/lib/perl5/vendor_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/core_perl ] && PATH=$PATH:/usr/bin/core_perl
Il n’ya rien de /etc/skelsurprenant non plus dans les /etc/cron*fichiers qui se trouvent dans aucun fichier:
$ grep PATH /etc/cron* /etc/cron*/*
grep: /etc/cron.d: Is a directory
grep: /etc/cron.daily: Is a directory
grep: /etc/cron.hourly: Is a directory
grep: /etc/cron.monthly: Is a directory
grep: /etc/cron.weekly: Is a directory
/etc/cron.d/0hourly:PATH=/sbin:/bin:/usr/sbin:/usr/bin
Alors, où est le PATH par défaut de cron pour les crontabs utilisateur en cours de définition? Est-ce qu'il est codé en dur cron? Ne lit-il pas une sorte de fichier de configuration pour cela?
/etc/profilecar il utilise la même syntaxe ( var=value) que cronlui-même, il serait donc assez facile à faire et /etc/profileest, à ma connaissance, très répandu. Ce qui m'a surpris, c'est que je ne pouvais pas le trouver installé nulle part, donc il semblait que c'était codé en dur. Comme c'est en effet le cas, comme l'a expliqué Stephen ci-dessous.
zshde shell interactif ne s’intéressent pas à la question /etc/profile(ce qui est propre à bash)
profilefichiers ne sont lus que par des shells de connexion. Ceux-ci peuvent ou non être interactifs.
stringscontre un programme peut aussi aider à trouver ces valeurs codées en dur.
cronde regarder/etc/profileou de s'intéresser à une coquille particulière. Une meilleure question est pourquoi ne pascronlire àPATHpartir delogin.defs(sous Linux) oulogin.conf(* sur BSD). Je suppose que c'est finalement un détail de mise en œuvre.