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/sh
o shell que o cron usa 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 de source virtualenv/bin/activate
qualquer 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.