Пользовательская команда 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