Por que o ENV do cron é diferente do ENV do usuário?

Por que o ENV do cron é diferente do ENV do usuário?

Em uma nova instalação do Ubuntu, o usuário PATHé:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Mas no ambiente cron do mesmo usuário, é:

/usr/bin:/bin

Eu olhei para todos os arquivos de ponto do usuário no diretório inicial, nada lá está alterando o arquivo PATH.

O que está mudando o PATH? Por que o cron não usa isso PATH?

Responder1

Em relação à pergunta - por que isso acontece - a página de manual que explica isso é crontab(5), IOW, aquela acessível através man 5 crontab(não a padrão na seção 1). O daemon cron não tenta emular uma sessão shell, em vez disso, ele configura um ambiente limpo e mínimo para a execução dos cron jobs e, por sua vez, permite que o arquivo crontab defina suas próprias variáveis ​​de ambiente arbitrárias. O daemon cron mais recente fornecido com o Debian também possui várias provisões adicionais para pam_envetc.

Responder2

Cron não executa processos em um shell de login. Por causa disso, todos os scripts típicos não são originados quando um processo é executado.

A execução do processo a partir de um shell de login deve replicar o ambiente do usuário.

Coloque algo assim em um crontab e compare as duas saídas:

*/1 * * * * /usr/bin/env > /tmp/env                                             
*/1 * * * * /usr/bin/bash -l -c /usr/bin/env > /tmp/bashenv  

Como você pode ver, /tmp/bashenvhaverá uma série de variáveis ​​de ambiente que /tmp/envnão possuem. Isso ocorre porque envfoi invocado em um shell de login usando bash -l.

informação relacionada