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
¿Fue útil?

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 ().

  1. 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
    
  2. 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top