Я пытаюсь запустить команду управления Django из cron. Я использую virtualenv, чтобы оставить свой проект изолированным.
Здесь и в других местах я видел примеры, показывающие выполнение команд управления изнутри virtualenv, например:
0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg
Однако, хотя системный журнал показывает запись, когда задача должна была начаться, эта задача фактически никогда не запускается (файл журнала для скрипта пуст). Если я запускаю строку вручную из оболочки, она работает как положено.
Единственный способ получить команду для запуска через 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 ничего не сделал. Это работает, так и с шоу.
источник
env
иexport
все это в оболочку bash-скрипта, которую вы вызываете из crontab.Ответы:
Вы должны быть в состоянии сделать это, используя
python
в вашей виртуальной среде:РЕДАКТИРОВАТЬ: Если ваш проект Django не находится в PYTHONPATH, то вам нужно переключиться на правильный каталог:
Вы также можете попытаться записать сбой в cron:
Еще одна вещь, которую стоит попробовать - это внести те же изменения в ваш
manage.py
скрипт на самом верху:источник
~
на полный путь? (Вы , вероятно , сделал, только убедившись , что ...)Запуск
source
из cronfile не будет работать, так как cron использует в/bin/sh
качестве оболочки по умолчанию, которая не поддерживаетsource
. Вам необходимо установить переменную среды SHELL/bin/bash
:Трудно определить, почему это не удается, так как
/var/log/syslog
не регистрирует подробности ошибки. Лучше всего использовать псевдоним пользователя root, чтобы получать по электронной почте сообщения об ошибках cron. Просто добавь себя/etc/aliases
и бегиsendmail -bi
.Более подробная информация здесь: http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html
ссылка выше изменена на: https://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/
источник
. /path/to/virtualenv/bin/activate
postactivate
файл, вы должны делатьsource /path/to/virtualenv/bin/activate && source /path/to/virtualenv/bin/postactivate
Не смотрите дальше:
Общий подход:
Прелесть этого в том, что вам НЕ нужно менять
SHELL
переменную для crontab сsh
наbash
источник
Единственный правильный способ запуска заданий python cron при использовании virtualenv - это активировать среду и затем запустить python среды для запуска вашего кода.
Один из способов сделать это - использовать virtualenv
activate_this
в вашем скрипте Python, см .: http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-python.Другим решением является повторение всей команды, включая активацию среды и передачу ее в систему
/bin/bash
. Рассмотрим это для вашего/etc/crontab
:источник
Вместо того, чтобы возиться с шебангами, характерными для виртуленва, просто перенеситесь
PATH
в crontab.Запустите эти три команды из активированного virtualenv, и сценарии python должны просто работать:
Первая строка crontab теперь должна выглядеть так:
источник
Лучшее решение для меня было для обоих
man python
упоминает об изменении пути в оболочке$PYTHONPATH
или в python с помощьюsys.path
Другие ответы упоминают идеи сделать это с помощью оболочки. Из python добавление следующих строк в мой скрипт позволяет мне успешно запускать его прямо из cron.
Вот как это выглядит в интерактивном сеансе -
источник
Я хотел бы добавить это, потому что я потратил некоторое время на решение проблемы и не нашел здесь ответа на комбинацию использования переменных в cron и virtualenv. Так что, возможно, это кому-нибудь поможет.
Он не работал хорошо, когда он был настроен как
Спасибо @davidwinterbottom , @ reed-sandberg и @mkb за правильное направление. Принятый ответ на самом деле работает нормально, пока вашему питону не нужно запустить скрипт, который должен запускать другой двоичный файл питона из каталога venv / bin.
источник
Это решение, которое хорошо сработало для меня.
Я использую Miniconda с Conda версии 4.7.12 на Ubuntu 18.04.3 LTS.
Я могу поместить вышеупомянутое в сценарий и запустить его через crontab также без каких-либо проблем.
источник
источник