Tarefa do Cron executando um comando do Django Python através de um ambiente virtual que não funciona

5

Eu tenho um arquivo crontab supostamente executando um comando do Django depois de carregar o ambiente virtual do projeto:

*/1 * * * * source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand

... mas não faz absolutamente nada. O log cron não produz nenhum problema em particular:

Mar 13 19:51:01 110 CRON[23807]: (root) CMD (source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand)

Escusado será dizer que o comando em si funciona perfeitamente quando copiado e colado no shell.

Eu sei que ele está relacionado às variáveis de ambiente do meu crontab, mas eu sou muito ignorante em relação a esse assunto, e não tenho idéia do que fazer, especialmente quando ele é executado sob um env virtual de python. Deve usar minhas variáveis de ambiente do usuário? Os do virtualenv? Como implementar isso? Obrigado!

NB: Caso isso ajude, tenho a seguinte saída de minhas variáveis de ambiente crontab (ao exportar "env" para um arquivo através do crontab):

HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
LC_ALL=en_US.UTF-8
PWD=/root

E as seguintes variáveis de ambiente no ambiente virtual do projeto:

TERM=xterm-256color
SHELL=/bin/bash
SSH_CLIENT=x.x.x.x 53007 22
OLDPWD=/root/production/mydjangoproject
SSH_TTY=/dev/pts/0
LC_ALL=en_US.UTF-8
USER=root
VIRTUAL_ENV=/home/virtualenvs/mydjangoproject-venv
MAIL=/var/mail/root
PATH=/home/virtualenvs/mydjangoproject-
venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/root
LANG=en_US.UTF-8
PS1=(mydjangoproject-venv)${debian_chroot:+($debian_chroot)}\u@$(hostname -f):\w\$ 
SHLVL=1
HOME=/root
LS_OPTIONS=--color=auto --group-directories-first
LOGNAME=root
SSH_CONNECTION=x.x.x.x 53007 x.x.x.x 22
LC_CTYPE=en_US.UT
    
por bolino 13.03.2018 / 20:27

1 resposta

6

Existem algumas maneiras de resolver isso:

Primeiro, não funciona porque /bin/sh é o cron do shell usado para executar comandos, mas /bin/sh não suporta source . Portanto, a solução rápida é definir SHELL=/bin/bash no crontab.

Ou ...

Em segundo lugar, não é necessário source virtualenv/bin/activate de qualquer maneira. Você pode apenas chamar o virtualenv python diretamente.

* * * * * cd /home/www/production/mydjangoproject; /home/virtualenvs/mydjangoproject-venv/bin/python manage.py mydjangocommand

Estas foram tiradas de esta questão sobre SO , cujas respostas podem conter outras ideias para pessoas de semelhante, mas não exatamente as mesmas circunstâncias.

    
por 13.03.2018 / 21:12