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

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

Eu tenho um arquivo crontab supostamente executando um comando Django após 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 do cron não gera nenhum problema específico:

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 está relacionado às variáveis ​​de ambiente do meu crontab, mas não tenho muita educação sobre esse assunto e não tenho ideia do que fazer, especialmente quando ele é executado em um ambiente virtual python. Deveria usar minhas variáveis ​​de ambiente de usuário? Os do virtualenv? Como implementar isso? Obrigado!

NB: Caso ajude, tenho a seguinte saída das 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

Responder1

Existem algumas maneiras de resolver isso:

Primeiro, não funciona porque /bin/sho shell que o cron usa para executar comandos, mas /bin/shnão suporta source. Portanto, a solução rápida é definir SHELL=/bin/bashno crontab.

Ou...

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

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

Estes foram tirados deesta pergunta no SO, cujas respostas podem conter outras ideias para pessoas em circunstâncias semelhantes, mas não exatamente nas mesmas.

informação relacionada