[python] Cron и virtualenv



Answers

Запуск source из cronfile не будет работать, поскольку cron использует /bin/sh качестве своей оболочки по умолчанию, которая не поддерживает source . Вам необходимо установить переменную среды SHELL равной /bin/bash :

SHELL=/bin/bash
*/10 * * * * root source /path/to/virtualenv/bin/activate && /path/to/build/manage.py some_command > /dev/null

Трудно понять, почему это не удается, поскольку /var/log/syslog не регистрирует данные об ошибках. Лучше всего подражать себе root, чтобы вы получали по электронной почте любые ошибки cron. Просто добавьте себя в /etc/aliases и запустите sendmail -bi .

Подробнее здесь: http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html

Question

Я пытаюсь запустить команду управления Django из cron. Я использую virtualenv для сохранения моего проекта в песочнице.

Я видел примеры здесь и в других местах, которые показывают запущенные команды управления из virtualenv:

0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg

Однако, несмотря на то, что syslog показывает запись, когда задача должна была начаться, эта задача никогда не запускается (файл журнала для скрипта пуст). Если я запускаю строку вручную из оболочки, она работает так, как ожидалось.

Единственный способ, которым я могу в настоящее время получить команду для запуска через cron, - это разбить команды и поместить их в немой сценарий оболочки bash:

#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg

РЕДАКТИРОВАТЬ:

ars придумал комбинацию команд:

0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg

По крайней мере, в моем случае вызов сценария активации для virtualenv ничего не сделал. Это работает, так и с шоу.




Единственный правильный способ запуска заданий python cron при использовании virtualenv - активировать среду, а затем выполнить python среды для запуска вашего кода.

Один из способов сделать это - activate_this virtualenv в этом скрипте python, см. http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-python

Другим решением является повторение всей команды, включая активацию среды и ее подключение в /bin/bash . Рассмотрим это для вашего /etc/crontab :

***** root echo 'source /env/bin/activate; python /your/script' | /bin/bash



Links