Как выполнить крон Django в crontab?

У меня есть приложение Django, которое использует django-крон (https://django-cron.readthedocs.io/en/latest/installation.html), и я должен выполниться python manage.py runcrons каждые 5 минут в AWS EC2, работающем на Ubuntu. Я пытался поместить эту команду в crontab-e, но ничего не происходит, там что-то, что я пропустил?

*/5 * * * * source /home/user/.bashrc && source /home/user/django-apps/venv/bin/activate && python /home/user/django-apps/project/manage.py runcrons > /home/bongga-admin/cronjob.log
3
задан 19 February 2019 в 16:36

1 ответ

Я не знаком с Django, но я вижу следующее:

  1. Оболочка Крона по умолчанию /bin/sh.

  2. Команда source резюме к . в bash, но не в sh.

  3. Так sh -c 'source ...' возвратит ошибку, но && средства, если предыдущая команда возвращает true, делают следующий, по-видимому, Ваши сбои команды на этой первой части. Вы перенаправили только вывод последней команды к файлу журнала, так вероятно, это остается пробелом.

  4. Кроме того, я не думаю, что можно успешно получить .bashrc в sh.

  5. В crontab, долина по умолчанию envvar $PATH /usr/bin:/bin. Для всех команд/сценариев, которые расположены за пределами этих каталогов, необходимо применить полный путь; Вы можете export новое значение $PATH, перед заданием; или даже можно использовать $(which my_command) вместо просто my_command.


Согласно вышеупомянутому, я предполагаю, Ваш crontab запись должна быть чем-то как:

*/5 * * * * bash -c 'source /home/user/.bashrc && source /home/user/django-apps/venv/bin/activate && python /home/user/django-apps/project/manage.py runcrons' > /home/user/cronjob.log 2>&1
  • Последняя часть 2>&1 перенаправит также ошибки к файлу журнала.

Другой путь, который я предпочел бы, состоит в том, чтобы создать простой сценарий, который выполнит все эти команды:

#!/bin/bash
source /home/user/.bashrc
source /home/user/django-apps/venv/bin/activate
python /home/user/django-apps/project/manage.py runcrons

Сценарий должен быть исполняемым файлом:

chmod +x /path/to/script.sh

И crontab будет более простым:

*/5 * * * * /path/to/script.sh > /home/user/cronjob.log 2>&1

Если задание Крона инициировано crontab определенного пользователя, и если Вы хотите сделать сценарий более портативным, можно заменить /home/user с переменной среды $HOME (имейте в виду, что необходимо использовать двойные кавычки, когда Вы работаете с переменными в оболочке).

1
ответ дан 1 December 2019 в 17:26

Другие вопросы по тегам:

Похожие вопросы: