У меня есть приложение 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
Я не знаком с Django, но я вижу следующее:
Оболочка Крона по умолчанию /bin/sh
.
Команда source
резюме к .
в bash
, но не в sh
.
Так sh -c 'source ...'
возвратит ошибку, но &&
средства, если предыдущая команда возвращает true, делают следующий, по-видимому, Ваши сбои команды на этой первой части. Вы перенаправили только вывод последней команды к файлу журнала, так вероятно, это остается пробелом.
Кроме того, я не думаю, что можно успешно получить .bashrc
в sh
.
В 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
(имейте в виду, что необходимо использовать двойные кавычки, когда Вы работаете с переменными в оболочке).