Задание Cron, запускающее команду Django Python через виртуальную среду, не работает

Задание Cron, запускающее команду Django Python через виртуальную среду, не работает

У меня есть файл crontab, предположительно выполняющий команду Django после загрузки виртуальной среды проекта:

*/1 * * * * source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand

...но это абсолютно ничего не делает. Журнал cron не выводит никаких особых проблем:

Mar 13 19:51:01 110 CRON[23807]: (root) CMD (source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand)

Само собой разумеется, что сама команда отлично работает, если ее скопировать и вставить в оболочку.

Я знаю, что это связано с переменными окружения моего crontab, но я очень необразован в этом вопросе и понятия не имею, что делать, особенно когда он запущен в виртуальном окружении python. Должен ли он использовать мои пользовательские переменные окружения? Те, что из virtualenv? Как это реализовать? Спасибо!

Примечание: Если это поможет, вот следующий вывод переменных среды crontab (при экспорте «env» в файл через crontab):

HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
LC_ALL=en_US.UTF-8
PWD=/root

И следующие переменные среды в виртуальной среде проекта:

TERM=xterm-256color
SHELL=/bin/bash
SSH_CLIENT=x.x.x.x 53007 22
OLDPWD=/root/production/mydjangoproject
SSH_TTY=/dev/pts/0
LC_ALL=en_US.UTF-8
USER=root
VIRTUAL_ENV=/home/virtualenvs/mydjangoproject-venv
MAIL=/var/mail/root
PATH=/home/virtualenvs/mydjangoproject-
venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/root
LANG=en_US.UTF-8
PS1=(mydjangoproject-venv)${debian_chroot:+($debian_chroot)}\u@$(hostname -f):\w\$ 
SHLVL=1
HOME=/root
LS_OPTIONS=--color=auto --group-directories-first
LOGNAME=root
SSH_CONNECTION=x.x.x.x 53007 x.x.x.x 22
LC_CTYPE=en_US.UT

решение1

Есть несколько способов решить эту проблему:

Во-первых, это не работает, потому что /bin/shэто оболочка, которую cron использует для запуска команд, но /bin/shне поддерживает source. Поэтому быстрое решение — установить SHELL=/bin/bashв crontab.

Или...

Во-вторых, это source virtualenv/bin/activateвообще не обязательно. Можно просто вызвать virtualenv python напрямую.

* * * * * cd /home/www/production/mydjangoproject; /home/virtualenvs/mydjangoproject-venv/bin/python manage.py mydjangocommand

Они были взяты изэтот вопрос на SO, ответы на которые могут содержать другие идеи для людей, находящихся в схожих, но не совсем одинаковых обстоятельствах.

Связанный контент