Cron no usa la ruta del usuario cuyo crontab es y, en cambio, tiene la suya. Se puede cambiar fácilmente agregando PATH=/foo/bar
al 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/environment
o /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 cron
sí mismo? ¿No lee algún tipo de archivo de configuración para esto?
/etc/profile
porque usa la misma sintaxis ( var=value
) que en cron
sí 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.
zsh
como su shell interactivo no les importa /etc/profile
(lo cual es específico para bash
)
profile
archivos solo se leen por shells de inicio de sesión. Estos pueden o no ser interactivos.
strings
contra un programa también puede ayudar a encontrar estos valores codificados.
cron
mirar/etc/profile
o preocuparse por un shell en particular. Una mejor pregunta es ¿por qué nocron
leerPATH
desdelogin.defs
(en Linux) ologin.conf
(en * BSD). Supongo que en última instancia es un detalle de implementación.