Django custom command y cron
-
05-07-2019 - |
Pregunta
Quiero que mi comando Django hecho a medida se ejecute cada minuto. Sin embargo, parece que python /path/to/project/myapp/manage.py mycommand
no parece funcionar mientras que en el directorio python manage.py mycommand
funciona perfectamente.
¿Cómo puedo lograr esto? Uso / etc / crontab
con:
****** root python /path/to/project/myapp/manage.py mycommand
Solución
Creo que el problema es que cron va a ejecutar tus scripts en un " bare " entorno, por lo que su DJANGO_SETTINGS_MODULE probablemente no esté definido. Es posible que desee envolver esto en un script de shell que primero defina DJANGO_SETTINGS_MODULE
Algo como esto:
#!/bin/bash
export DJANGO_SETTINGS_MODULE=myproject.settings
./manage.py mycommand
Hazlo ejecutable (chmod + x) y luego configura cron para que ejecute el script en su lugar.
Editar
También quería decir que puedes " modularizar " este concepto un poco y hágalo tal que su script acepte los comandos de administración como argumentos.
#!/bin/bash
export DJANGO_SETTINGS_MODULE=myproject.settings
./manage.py ${*}
Ahora, su trabajo cron puede simplemente pasar " mycommand " o cualquier otro comando manage.py que desee ejecutar desde un trabajo cron.
Otros consejos
cd /path/to/project/myapp && python manage.py mycommand
Al encadenar sus comandos de esta manera, Python no se ejecutará a menos que cd cambie el directorio correctamente.
Si quieres que tu vida en Django sea mucho más simple, usa django-command-extensions dentro de tu proyecto:
http://code.google.com/p/django-command-extensions /
Encontrarás un comando llamado " runscript " así que simplemente agregue el comando a su línea crontab:
****** root python /path/to/project/myapp/manage.py runscript mycommand
Y tal script se ejecutará con el entorno de contexto de Django.
Esto es lo que he hecho recientemente en uno de mis proyectos, (mantengo venvs para cada proyecto en el que trabajo, así que supongo que usted tiene venvs)
***** /path/to/venvs/bin/python /path/to/app/manage.py command_name
Esto funcionó perfectamente para mí.
La extensión de script no estaba bien documentada. A diferencia del comando django, este puede ir a cualquier parte de su proyecto y requiere una carpeta de scripts. El archivo .py requiere una función run ().
-
Si es una secuencia de comandos independiente, debe hacer esto:
from django.conf import settings from django.core.management import setup_environ setup_environ(settings) #your code here which uses django code, like django model
-
Si es un comando django, es más fácil: https://coderwall.com/p/k5p6ag
En (administración / comandos / exporter.py)
from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): args = '' help = 'Export data to remote server' def handle(self, *args, **options): # do something here
Y luego, en la línea de comando:
$ python manage.py exporter
Ahora, es fácil agregar una nueva tarea cron a un sistema Linux, usando crontab:
$ crontab -e
or $ sudo crontab -e if you need root privileges
En el archivo crontab, por ejemplo, para ejecutar este comando cada 15 minutos, algo como esto:
# m h dom mon dow command
*/15 * * * * python /var/www/myapp/manage.py exporter