Пользовательская команда Django и cron
-
05-07-2019 - |
Вопрос
Я хочу, чтобы моя специальная команда Django выполнялась каждую минуту.Однако похоже, что python /path/to/project/myapp/manage.py mycommand
кажется, не работает в каталоге python manage.py mycommand
работает отлично.
Как я могу этого добиться?я использую /etc/crontab
с:
****** root python /path/to/project/myapp/manage.py mycommand
Решение
Я думаю, проблема в том, что 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.
Другие советы
cd /path/to/project/myapp && python manage.py mycommand
Путем цепочки ваших команд, подобных этой, python не будет выполняться, пока cd не изменит каталог правильно.
Если вы хотите, чтобы ваша жизнь в 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.
Это то, что я недавно сделал в одном из моих проектов (я поддерживаю venvs для каждого работающего проекта, поэтому я предполагаю, что у вас есть venvs)
***** /path/to/venvs/bin/python /path/to/app/manage.py command_name
Это отлично сработало для меня.
Расширение RunScript не было хорошо задокументировано. В отличие от команды django, эта команда может находиться в любом месте вашего проекта и требует наличия папки скриптов. Для файла .py требуется функция run ().
Если это автономный скрипт, вам нужно сделать это:
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 а> р>
В (management / commands / 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