2009-10-21 3 views
13

Ich möchte meine maßgeschneiderte Django-Befehl jede Minute ausgeführt werden. Es scheint jedoch wie python /path/to/project/myapp/manage.py mycommand scheint nicht zu arbeiten, während im Verzeichnis python manage.py mycommand funktioniert perfekt.Django benutzerdefinierten Befehl und Cron

Wie kann ich das erreichen? Ich benutze /etc/crontab mit:

****** root python /path/to/project/myapp/manage.py mycommand 

Antwort

16

Ich denke, das Problem ist, dass cron Ihre Skripte in einer „nackten“ Umgebung ausgeführt wird, so dass Ihr DJANGO_SETTINGS_MODULE ist wahrscheinlich nicht definiert. Möglicherweise möchten Sie diese in ein Shell-Skript wickeln, die zuerst DJANGO_SETTINGS_MODULE

Etwas wie folgt definiert:

#!/bin/bash 

export DJANGO_SETTINGS_MODULE=myproject.settings 
./manage.py mycommand 

Machen Sie es ausführbar (chmod + x) und dann einrichten cron stattdessen das Skript auszuführen.

bearbeiten

Ich wollte auch sagen, dass Sie dieses Konzept ein wenig „modularisieren“ kann und es so machen, dass Ihr Skript übernimmt die Befehle als Argumente verwalten.

#!/bin/bash 

export DJANGO_SETTINGS_MODULE=myproject.settings 
./manage.py ${*} 

jetzt Ihr Cron-Job kann einfach passieren „mycommand“ oder anderen manage.py Befehl, den Sie von einem cron-Job ausgeführt werden sollen.

+1

Das sagt unbekannten Befehl, wenn ich es tue. Ich musste es ändern in: cd/pfad/zu/project ./manage.py $ {*} – mhost

+0

Kein Erfolg. Der benutzerdefinierte Befehl wird erkannt, aber der Befehl kann anscheinend die Datenbank nicht finden. – Raphael

+0

Was meinen Sie mit "Befehl scheint die Datenbank nicht zu finden"? Bedeutet das einen Fehler? –

9

Wenn Sie Ihr Leben Django viel einfacher, Verwendung django-Befehlserweiterungen innerhalb Ihres Projekts:

http://code.google.com/p/django-command-extensions/

Sie werden ein Befehl „runscript“ genannt finden, so dass Sie einfach den Befehl hinzufügen zu Ihrer Crontab-Zeile:

****** root python /path/to/project/myapp/manage.py runscript mycommand 

Und ein solches Skript wird mit der Django-Kontextumgebung ausgeführt.

0

Die Erweiterung des Skripts wurde nicht gut dokumentiert. Im Gegensatz zum django-Befehl kann dieser überall in Ihrem Projekt verwendet werden und erfordert einen Skriptordner. Die .py-Datei benötigt eine run() -Funktion.

11
cd /path/to/project/myapp && python manage.py mycommand 

Wenn Sie Ihre Befehle wie folgt verketten, wird Python erst ausgeführt, wenn cd das Verzeichnis korrekt ändert.

+0

Dies war der einfachste Weg, es für mich zu tun, und es hat gut funktioniert. Danke David! – thomallen

+2

das hat für mich nicht funktioniert (immer noch ein Nein-Modul namens django.core.management Fehler in meinen Mails) –

1

Das ist, was ich in einem meiner Projekte vor kurzem getan haben, (i halten VENVS für jedes Projekt ich arbeite, also bin ich assumning Sie VENVS haben)

***** /path/to/venvs/bin/python /path/to/app/manage.py command_name 

Das funktionierte perfekt für mich.

0
  1. Wenn sie ein eigenständiges Skript, müssen Sie dies tun:

    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. Wenn sie ein django Befehl, sein einfacher: https://coderwall.com/p/k5p6ag

    In (Management/Befehle/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 
    

Und dann in der Befehlszeile:

$ python manage.py exporter 

Jetzt ist es einfach, eine neue Crontask zu einem Linux-System hinzuzufügen, crontab:

$ crontab -e 

or $ sudo crontab -e if you need root privileges 

In der crontab-Datei, zum Beispiel für den Lauf Dieser Befehl alle 15 Minuten, etwa wie folgt:

# m h dom mon dow command 
*/15 * * * * python /var/www/myapp/manage.py exporter