as variáveis de ambiente não são configuradas na tarefa Cron

0

Estou tentando instalar uma nova tarefa Cron em um servidor. Eu sou capaz de executar o processo via linha de comando, mas não pode executá-lo via cron. Isto é devido a variáveis de ambiente para o PATH e o PYTHONPATH não serem configurados corretamente quando a tarefa é executada via cron. (Na verdade, estou tendo esse problema com todos os trabalhos cron no servidor, mas estou focando em um processo nesta questão para simplificar.)

Aqui está a entrada do cron para o processo:

### procmon NLite ### */2 * * * * . ~/.bashrc; cd /var/networkip/nlite/proc_mon; . bashrc; cd bin; ./proc_mon.py > /dev/null 2>&1

Agora, o bashrc no diretório proc_mon contém:

BASEDIR=$PWD
KODIAK_ROOT=$BASEDIR/
BASEPATH=$KODIAK_ROOT

pathadd PYTHONPATH ${BASEDIR}/lib

Então, quando o crontask é executado - PYTHONPATH deve ser redefinido, mas isso não está acontecendo.

Existem vários outros servidores mais antigos executando com êxito esses procs via cron.
Soluções tentadas até agora:

  • comparou todos os bashrc ou bash_profiles de uma execução bem-sucedida da tarefa Cron para o servidor que não conseguiu executar crons
  • Variáveis do ambiente de log registradas para confirmar que esse é o problema

Soluções em que não estou interessado:

  • uma tarefa cron para definir variáveis ambientais. Existem vários procs que precisam ser executados via cron e todos têm variáveis PATH e PYTHONPATH diferentes em relação a esse script específico. Fazer isso pode ficar muito confuso e não é uma boa solução a longo prazo, pois eu instalo os mesmos procs e crons em servidores futuros.

Mais informações:

  • Linux distro para o cron do servidor com falha: lançamento do CentOS 6.8
  • Linux distro para servidor com sucesso cron: Servidor Red Hat Enterprise Linux versão 5.2 (Tikanga)

Como o crons é capaz de trabalhar em outros servidores, deve haver uma solução razoável para o problema.

    
por remy 28.02.2017 / 16:49

1 resposta

0

Que tal mudar sua linha de comando / cronjob:

bash -c "PYTHONPATH=/var/networkip/nlite/proc_mon/lib:$PYTHONPATH python /var/networkip/nlite/proc_mon/proc_mon.py > /dev/null 2>&1"

Entre o RH5.2 e o RH6.8 (para não falar do CentOS), há muitas diferenças (que eu gostaria de ter uma fonte agora), incluindo uma mudança no daemon do cron (de cron para cronie, eu acho).

Independentemente disso, há outras coisas que você pode querer verificar:

  • verifique se o seLinux é parte da imagem (grep para o seu caminho em /var/log/audit/audit.log se você tiver esse arquivo, verifique o AVC)
  • chame um script bash do cron e configure seu ambiente nesse script (em vez de ter um cron cron longo) - você pode usar /etc/cron.d para isso.
  • tente executar seu script com um env limpo: env -i PYTHONPATH=/var/networkip/nlite/proc_mon/lib:$PYTHONPATH python /var/networkip/nlite/proc_mon/proc_mon.py > /dev/null 2>&1

Você diz que isso está acontecendo para 'todos os cron jobs', então eu verificaria primeiro o seLinux. Deixe-o ativado / impingido, mas use algo como audit2allow para corrigir seus problemas específicos.

Também pode valer a pena remover o redirecionamento de saída para / dev / null para que você possa ver qual é o problema real.

    
por 28.02.2017 / 18:07