Somando-se à resposta de Stephen Kitt, há um arquivo de configuração que define PATH para o cron no Ubuntu, e cron ignora que PATH usa o padrão embutido em código (ou PATH s definido nos próprios crontabs). O arquivo é /etc/environment . Observe a configuração do PAM de cron :
$ cat /etc/pam.d/cron
...
# Read environment variables from pam_env's default files, /etc/environment
# and /etc/security/pam_env.conf.
session required pam_env.so
# In addition, read system locale information
session required pam_env.so envfile=/etc/default/locale
...
Isso é facilmente verificável. Adicione uma variável a /etc/environment , digamos foo=bar , execute env > /tmp/foo como um cronjob e observe como foo=bar aparece na saída.
But why? The default system-wide path is set in /etc/profile, but that
includes other directories:
$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
Isso é verdade no Arch Linux, mas no Ubuntu, a base PATH está definida em /etc/environment . Os arquivos em /etc/profile.d são anexados a um PATH existente e você pode anexá-lo em ~/.pam_environment . Eu tenho um um bug arquivado sobre o comportamento do Arch .
Infelizmente, /etc/pam.d/cron não inclui a leitura de ~/.pam_environment . Estranhamente, /etc/pam.d/atd inclui esse arquivo:
$ cat /etc/pam.d/atd
#
# The PAM configuration file for the at daemon
#
@include common-auth
@include common-account
session required pam_loginuid.so
@include common-session-noninteractive
session required pam_limits.so
session required pam_env.so user_readenv=1
... mas os comandos executados via at aparentemente herdam o ambiente disponível ao criar o trabalho at (por exemplo, env -i /usr/bin/at ... parece executar trabalhos com um ambiente muito limpo).
A alteração de /etc/pam.d/cron para ter user_readenv=1 parece não causar problemas, e as variáveis em ~/.pam_environment começaram a aparecer bem (com exceção de PATH , é claro).
Tudo dito, a configuração de variáveis de ambiente para o cron parece ser um negócio confuso. O melhor lugar parece estar na própria especificação do trabalho, mesmo porque você não sabe quais variáveis de ambiente herdadas o cron pode decidir ignorar (sem ler a origem).