Пользовательская команда Django и cron

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

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

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

Ответы

Ответ 1

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

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

#!/bin/bash

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

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

Edit

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

#!/bin/bash

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

  • Если это автономный script, вам нужно сделать это:

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

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