2009-10-21 4 views
13

Я хочу, чтобы моя пользовательская команда Django выполнялась каждую минуту. Однако, похоже, python /path/to/project/myapp/manage.py mycommand не работает, хотя в каталоге python manage.py mycommand работает отлично.Пользовательская команда Django и cron

Как я могу это достичь? Я использую /etc/crontab с:

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

ответ

16

Я думаю, что проблема в том, что хроны собираются запускать скрипты в «голой» окружающей среде, так что ваш DJANGO_SETTINGS_MODULE, скорее всего, не определен. Вы можете обернуть это в скрипт, который первым определяет DJANGO_SETTINGS_MODULE

Что-то вроде этого:

#!/bin/bash 

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

Сделать его исполняемым (CHMOD + х), а затем настроить хрон для запуска сценария вместо этого.

Редактировать

Я также хотел бы сказать, что вы можете «модуляризуете» эту концепцию немного и сделать это таким образом, чтобы ваш скрипт принимает управление командой в качестве аргументов.

#!/bin/bash 

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

Теперь ваши хроны можно просто передать «МояКоманду» или любой другой manage.py команду, которую вы хотите запустить с хрон.

+1

Это говорит о неизвестной команде, когда я это делаю. Мне пришлось изменить его на: cd/path/to/project ./manage.py $ {*} – mhost

+0

Успех не был. Пользовательская команда распознается, но команда, видимо, не может найти базу данных. – Raphael

+0

Что вы подразумеваете под «командой, по-видимому, не можете найти базу данных»? Это влечет за собой какую-то ошибку? –

9

Если вы хотите, чтобы ваш Джанго жизнь намного более простой, использование Джанго-команд-расширений в пределах вашего проекта:

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

Вы найдете команду под названием «RunScript», так что вы просто добавить команду к вашей линии crontab:

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

И такой скрипт будет выполняться с контекстной средой Django.

0

Расширение строчной строки не было хорошо документировано. В отличие от команды django, она может работать в любом месте вашего проекта и требует наличия папки сценариев. Для файла .py требуется функция run().

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

Путем связывания ваших команд, как это, python не будет выполнен, если cd правильно не изменит каталог.

+0

Это был самый простой способ сделать это для меня, и это сработало хорошо. Спасибо, Дэвид! – thomallen

+2

, который не работал для меня (у меня еще нет модуля с именем django.core.management error в моих письмах) –

1

Это то, что я сделал недавно в одном из моих проектов (я сохранить venvs для каждого проекта я работаю, поэтому я assumning у вас есть venvs)

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

Это работало отлично для меня.

0
  1. Если его автономный скрипт, вам нужно сделать, это:

    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. Если его команды Джанго, его проще: https://coderwall.com/p/k5p6ag

    В (управление/команды/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 
    

А потом, в командной строке:

$ python manage.py exporter 

Теперь это легко добавить новую задачу хрон к системе Linux, используя кронтаб:

$ crontab -e 

or $ sudo crontab -e if you need root privileges 

В файле кронтаб, например, для запуска эта команда каждые 15 минут, примерно так:

# m h dom mon dow command 
*/15 * * * * python /var/www/myapp/manage.py exporter 
Смежные вопросы