Запуск скрипта Python для Django через Cron - PullRequest
2 голосов
/ 09 августа 2010

У меня есть скрипт на python, который подключается к внешнему хосту, получает некоторые данные и заполняет базу данных Django данными. Сценарий python, который заполняет базу данных, использует эти строки для настройки среды django:

path = os.path.normpath(os.path.join(os.getcwd(), '..'))
sys.path.append(path)
from django.core.management import setup_environ
import settings
setup_environ(settings)

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

export PYTHONPATH=$PYTHONPATH:/home/django/project_dir/
cd ~/project_dir/scripts/
~/virtualenv/bin/python my_script.py

А потом мой конфиг cron, который находится в /etc/cron.d/

0 1 * * * django ~/project_dir/scripts/my_script.sh > /var/log/django_cron.log

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

Сценарий оболочки работает нормально, когда я вошел в систему как пользователь django. Но крон не побежит! Я не получаю ошибок в файле журнала. Я уверен, что это что-то очень простое, но я просто не вижу этого ...

Ответы [ 2 ]

2 голосов
/ 10 августа 2010

Проблема была в том, что у меня есть переменная окружения, которая сообщает django, запущена ли она в разработке или производстве.Crontab не выполняет файл .bashrc, куда я экспортирую эту переменную, поэтому его нужно было добавить в мой сценарий оболочки:

export FLAVOR=live
export PYTHONPATH=$PYTHONPATH:/home/django/project_dir/
cd ~/project_dir/scripts/
~/virtualenv/bin/python my_script.py
0 голосов
/ 10 августа 2010

На ум приходят две вещи. Я не думаю, что cron сделает замену тильды, которую вы ожидаете - возможно, я ошибаюсь, но попробуйте указать полный путь (т.е. / home / myuser / project_dir / ...) в вашей записи cron, а также скрипты.

Кроме того, что такое "django" в вашей записи cron? Это название вашего сценария или это опечатка? Наконец, чтобы записать возможные ошибки при выполнении вашего скрипта, попробуйте:

0 1 * * * /home/myuser/project/script.sh > /var/log/django_cron.log 2>&1
...