Estoy tratando de ejecutar un comando de administración de Django desde cron. Estoy usando virtualenv para mantener mi proyecto protegido.
He visto ejemplos aquí y en otros lugares que muestran comandos de administración en ejecución desde dentro de virtualenv como:
0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg
Sin embargo, aunque syslog muestra una entrada cuando la tarea debería haber comenzado, esta tarea nunca se ejecuta realmente (el archivo de registro para el script está vacío). Si ejecuto la línea manualmente desde el shell, funciona como se esperaba.
La única forma en que actualmente puedo obtener el comando para que se ejecute a través de cron, es dividir los comandos y ponerlos en un script de envoltura de bash tonto:
#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg
EDITAR:
Ars se le ocurrió una combinación funcional de comandos:
0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg
Al menos en mi caso, invocar el script de activación para virtualenv no hizo nada. Esto funciona, así sucesivamente con el espectáculo.
fuente
env
yexport
todos ellos en un contenedor de script bash al que llama desde el crontab.Respuestas:
Debería poder hacer esto utilizando el
python
en su entorno virtual:EDITAR: si su proyecto django no está en PYTHONPATH, deberá cambiar al directorio correcto:
También puede intentar registrar el error desde cron:
Otra cosa para intentar es hacer el mismo cambio en su
manage.py
script en la parte superior:fuente
~
con el camino completo? (Probablemente lo hiciste, solo asegurándote ...)Ejecutar
source
desde un archivo cron no funcionará, ya que cron lo utiliza/bin/sh
como su shell predeterminado, que no es compatiblesource
. Debe configurar la variable de entorno SHELL para que sea/bin/bash
:Es difícil detectar por qué esto falla, ya
/var/log/syslog
que no registra los detalles del error. Lo mejor es usar un alias para rootear para que te envíen un correo electrónico con cualquier error cron. Simplemente agréguese/etc/aliases
y corrasendmail -bi
.Más información aquí: http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html
el enlace de arriba se cambia a: https://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/
fuente
. /path/to/virtualenv/bin/activate
postactivate
archivo, deberías hacerlosource /path/to/virtualenv/bin/activate && source /path/to/virtualenv/bin/postactivate
No busques más:
Enfoque genérico:
Lo bueno de esto es que NO necesita cambiar la
SHELL
variable para crontab desh
abash
fuente
La única forma correcta de ejecutar trabajos cron de python cuando se utiliza virtualenv es activar el entorno y luego ejecutar el python del entorno para ejecutar su código.
Una forma de hacerlo es usar virtualenv
activate_this
en su script de Python, consulte: http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-pythonOtra solución es hacer eco del comando completo, incluida la activación del entorno y su canalización
/bin/bash
. Considere esto para su/etc/crontab
:fuente
En lugar de perder el tiempo con shebangs específicos de virtualenv, simplemente anteponga
PATH
al crontab.Desde un virtualenv activado, ejecute estos tres comandos y los scripts de Python deberían funcionar:
La primera línea del crontab debería verse así:
fuente
La mejor solución para mí fue a ambos
man python
menciona la modificación de la ruta en shell en$PYTHONPATH
o en python consys.path
Otras respuestas mencionan ideas para hacer esto usando el shell. Desde python, agregar las siguientes líneas a mi script me permite ejecutarlo con éxito directamente desde cron.
Así es como se ve en una sesión interactiva:
fuente
Me gustaría agregar esto porque pasé algún tiempo resolviendo el problema y no encontré una respuesta aquí para la combinación del uso de variables en cron y virtualenv. Entonces quizás ayude a alguien.
No funcionó bien cuando se configuró como
Gracias @davidwinterbottom , @ reed-sandberg y @mkb por dar la dirección correcta. La respuesta aceptada realmente funciona bien hasta que su python necesite ejecutar un script que tenga que ejecutar otro binario de python desde el directorio venv / bin.
fuente
Esta es una solución que me ha funcionado bien.
Estoy usando miniconda con Conda versión 4.7.12 en un Ubuntu 18.04.3 LTS.
Puedo colocar lo anterior dentro de un script y ejecutarlo a través de crontab también sin ningún problema.
fuente
fuente