Cron non usa il percorso dell'utente di cui è crontab e, invece, ha il suo. Può essere facilmente modificato aggiungendo PATH=/foo/bar
all'inizio del crontab, e la soluzione alternativa classica è quella di utilizzare sempre percorsi assoluti ai comandi eseguiti da cron, ma dove è definito il PERCORSO predefinito di cron?
Ho creato un crontab con i seguenti contenuti sul mio sistema Arch (cronie 1.5.1-1) e testato anche su una scatola Ubuntu 16.04.3 LTS con gli stessi risultati:
$ crontab -l
* * * * * echo "$PATH" > /home/terdon/fff
Quello stampato:
$ cat fff
/usr/bin:/bin
Ma perché? Il percorso predefinito a livello di sistema è impostato /etc/profile
, ma include altre directory:
$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
Non c'è nient'altro di rilevante in /etc/environment
o /etc/profile.d
, gli altri file che pensavo potessero essere letti da 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
Non c'è nulla di rilevante in nessuno dei file /etc/skel
, non sorprende, né viene impostato in alcun /etc/cron*
file:
$ 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
Quindi, dove viene impostato il PATH predefinito di cron per i crontab dell'utente? È codificato in cron
sé? Non legge una sorta di file di configurazione per questo?
/etc/profile
perché usa la stessa sintassi ( var=value
) di se cron
stesso, quindi sarebbe abbastanza facile da fare ed /etc/profile
è, per quanto ne sappia , molto diffuso. Ciò che mi ha sorpreso è che non riuscivo a trovarlo impostato da nessuna parte, quindi sembrava che fosse codificato. Come è vero, come ha spiegato Stephen di seguito.
zsh
/etc/profile
bash
profile
file vengono comunque letti solo dalle shell di login. Questi possono o meno essere interattivi.
strings
su un programma può aiutare a trovare anche questi valori codificati.
cron
di guardare/etc/profile
o preoccuparsi di una particolare shell. Una domanda migliore è perché noncron
leggePATH
dalogin.defs
(su Linux) ologin.conf
(su * BSD). Suppongo che alla fine sia un dettaglio di implementazione.