Пользовательская команда Django и cron - PullRequest
15 голосов
/ 21 октября 2009

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

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

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

Ответы [ 6 ]

19 голосов
/ 21 октября 2009

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

Примерно так:

#!/bin/bash

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

Сделайте его исполняемым (chmod + x) и затем настройте cron для запуска скрипта.

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

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

#!/bin/bash

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

Теперь ваше задание cron может просто передать "mycommand" или любую другую команду manage.py, которую вы хотите запустить из задания cron.

12 голосов
/ 11 апреля 2010
cd /path/to/project/myapp && python manage.py mycommand

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

9 голосов
/ 21 октября 2009

Если вы хотите, чтобы ваша жизнь в Django была намного проще, используйте django-command-extensions в вашем проекте:

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

Вы найдете команду с именем "runcript", поэтому вы просто добавите команду в строку crontab:

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

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

2 голосов
/ 18 июня 2013

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

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

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

0 голосов
/ 15 августа 2014
  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. Если это команда django, проще: https://coderwall.com/p/k5p6ag

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

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

$ crontab -e

or $ sudo crontab -e if you need root privileges

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

# m h  dom mon dow   command
*/15 * * * * python /var/www/myapp/manage.py exporter
0 голосов
/ 11 апреля 2010

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

...