Cron no usa la ruta del usuario cuyo crontab es y, en cambio, tiene la suya. Se puede cambiar fácilmente agregando PATH=/foo/baral principio del crontab, y la solución clásica es usar siempre rutas absolutas a los comandos ejecutados por cron, pero ¿dónde se define la RUTA predeterminada de cron?
Creé un crontab con los siguientes contenidos en mi sistema Arch (cronie 1.5.1-1) y también probé en un cuadro Ubuntu 16.04.3 LTS con los mismos resultados:
$ crontab -l
* * * * * echo "$PATH" > /home/terdon/fff
Eso impreso:
$ cat fff
/usr/bin:/bin
¿Pero por qué? La ruta predeterminada del sistema está configurada /etc/profile, pero eso incluye otros directorios:
$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
No hay nada más relevante en /etc/environmento /etc/profile.d, los otros archivos que pensé podrían ser leídos por 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
Tampoco hay nada relevante en ninguno de los archivos /etc/skel, como era de esperar, ni se está configurando en ningún /etc/cron*archivo:
$ 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
Entonces, ¿dónde se establece la RUTA predeterminada de cron para las crontabs de usuario? ¿Está codificado en cronsí mismo? ¿No lee algún tipo de archivo de configuración para esto?
/etc/profileporque usa la misma sintaxis ( var=value) que en cronsí misma, por lo que sería bastante fácil de hacer y /etc/profile, que yo sepa, está muy extendido. Lo que me sorprendió es que no pude encontrarlo en ningún lugar, por lo que parecía que estaba codificado. Como es el caso, como Stephen explicó a continuación.
zshcomo su shell interactivo no les importa /etc/profile(lo cual es específico para bash)
profilearchivos solo se leen por shells de inicio de sesión. Estos pueden o no ser interactivos.
stringscontra un programa también puede ayudar a encontrar estos valores codificados.
cronmirar/etc/profileo preocuparse por un shell en particular. Una mejor pregunta es ¿por qué nocronleerPATHdesdelogin.defs(en Linux) ologin.conf(en * BSD). Supongo que en última instancia es un detalle de implementación.