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).