Por que o cron tentando mudar para o diretório home do usuário e como evitar isso?

0

Eu criei uma nova conta do sistema para o cronjob no meu centos 7 e configurei um cronjob para ele.

No entanto, meu cronjob não é executado com erro:

(CRON) ERROR chdir failed (/home/sysagent): No such file or directory

Atualmente, o crontab para a conta do sysagent se parece com:

15 16 * * * HOME="/tmp" && cd path/to/project_folder && ./src/mainroutine.sh | ts "[\%Y-\%m-\%d \%H:\%M:\%S]" >> /var/log/automation/sysagent.log

Eu adicionei a variável HOME e o cd à pasta do projeto depois de alguma investigação (costumava ter o caminho completo para o shell script lá), mas isso não ajuda. Como fazer o cronjob esquecer o diretório inicial? E por que está procurando pelo caminho?

    
por SMetana 08.05.2018 / 15:35

2 respostas

0

Supondo que os documentos são ruins ou errados, um mergulho com código fonte:

% rpm -qa | grep cron
cronie-1.4.11-17.el7.x86_64
cronie-anacron-1.4.11-17.el7.x86_64
crontabs-1.11-6.20121102git.el7.noarch

... alguns altagoobingleduckgoing aqui como o URL no RPM está quebrado ...

% git clone https://github.com/cronie-crond/cronie && cd cronie
% fgrep -rl 'chdir failed' .
./src/security.c

... para que o erro apareça apenas em um lugar, dentro da chamada cron_change_user_permanently que é chamada de vários outros locais no código ...

% grep cron_change_user_permanently **/*.c
src/do_command.c:               if (cron_change_user_permanently(e->pwd, env_get("HOME", jobenv)) < 0)
src/do_command.c:               if (cron_change_user_permanently(e->pwd, env_get("HOME", jobenv)) < 0)
src/popen.c:            if (cron_change_user_permanently(pw, env_get("HOME", jobenv)) != 0)
src/security.c:int cron_change_user_permanently(struct passwd *pw, char *homedir) {

... então, em todos os casos, a variável de ambiente HOME parece ser usada para determinar para onde chdir para o usuário, e sempre há um chdir para esse diretório. Portanto, você precisará garantir que o diretório HOME exista ou que HOME seja definido corretamente antes cron_change_user_permanently ser chamado (o que provavelmente acontece antes que o código do shell em sua tarefa do cron seja olhou para). (Ou patch de macaco cronie para fazer outra coisa, mas provavelmente é uma idéia muito ruim.)

    
por 08.05.2018 / 16:07
0

Quando cron executar o crontab de um usuário, ele será iniciado no usuário diretório inicial. O valor inicial dessa variável vem de /etc/passwd (em casos simples). No momento em que você tentar substituir HOME na entrada crontab , cron tentou mudar para $ {HOME}.

    
por 08.05.2018 / 16:05