El trabajo cron que ejecuta un comando Django Python a través de un entorno virtual no funciona

El trabajo cron que ejecuta un comando Django Python a través de un entorno virtual no funciona

Tengo un archivo crontab que supuestamente ejecuta un comando de Django después de cargar el entorno virtual del proyecto:

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

...pero no hace absolutamente nada. El registro cron no genera ningún problema 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)

No hace falta decir que el comando en sí funciona perfectamente cuando se copia y pega en el shell.

Sé que está relacionado con las variables de entorno de mi crontab, pero no tengo mucha educación sobre este asunto y no tengo idea de qué hacer, especialmente cuando se ejecuta bajo un entorno virtual de Python. ¿Debería utilizar mis variables de entorno de usuario? ¿Los del virtualenv? ¿Cómo implementar eso? ¡Gracias!

NB: En caso de que ayude, tengo el siguiente resultado de mis variables de entorno de crontab (al exportar "env" a un archivo a través de 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

Y las siguientes variables de entorno en el entorno virtual del proyecto:

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

Respuesta1

Hay un par de formas de solucionar esto:

Primero, no funciona porque /bin/shes el shell que usa cron para ejecutar comandos, pero /bin/shno es compatible source. Entonces, la solución rápida es configurarlo SHELL=/bin/bashen el crontab.

O...

En segundo lugar, de todos modos no es necesario source virtualenv/bin/activate. Puedes simplemente llamar a virtualenv python directamente.

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

Estos fueron tomados deesta pregunta en SO, cuyas respuestas pueden contener otras ideas para personas en circunstancias similares pero no iguales.

información relacionada