(x-posted от StackOverflow)
Я настроил крон для выполнения следующей команды для django-крона (django 1.10.5, python 3.5, анаконда 4.2.0) в человечности 16.04:
PATH=/user/project/projectname/website
* * * * * ./manage.py runcrons "app.crons.RunCronJob"
Вот мое дерево файла, которое расположено непосредственно под высшим уровнем удаленного сайта (/
):
|-- user
| |-- project
| | |-- projectname
| | | |-- website
| | | | |-- file.txt
| | | | |-- manage.py
| | | | |-- app (a django app)
| | | | | |-- crons.py
RunCronJob
cronjob в crons.py
это добавляет строку к file.txt
под /website
. Когда я вхожу /website
каталог и вручную делает ./manage.py runcrons "app.crons.RunCronJob"
, это работает просто великолепно. Однако, когда cronjob, который я настроил, выполняется, он ничего не добавляет к моему текстовому файлу. Я проверил, что задача крона работает каждую минуту с обоими grep cron /var/log/syslog
почтовый сервис, но данные, которые я получаю, кажется, не говорит мне ничего полезного о том, почему он не работает.
(Примечание для Python: Я добавил os.chdir(os.path.dirname(sys.argv[0]))
к вершине моего crons.py
гарантировать, что текстовый файл записан в в корректном каталоге, неважно, откуда команда выполняется. Например, выполнение website/manage.py runcrons "app.crons.RunCronJob"
от /projectname
работает на меня также. Поэтому я не подозреваю, что моя проблема связана с django, библиотекой django-крона или Python.)
Я просмотрел некоторые другие ответы, которые обсуждают некоторые типичные проблемы с кроном и старались изо всех сил решать любые проблемы: мой crontab имеет новую строку в конце, я установил свой часовой пояс (хотя это не должно влиять на мой cronjob), pgrep cron
возвращает число, я установил полномочия для своего текстового файла, я много раз перезапускал крон и т.д.
Хотя я также попытался правильно установить свои пути среды, я подозреваю, что некоторая часть его является все еще неправильной. Я попробовал различные вещи как добавление /home
перед /user
, удаление точки и/или наклонной черты перед manage.py
, и добавление абсолютного filepath перед моей командой, все напрасно.
Даже при том, что я думаю, что мой подозреваемый находится в том, как я устанавливаю свои пути, ошибка могла все еще быть где-то в другом месте в моем проекте. Какую проблему я пропускаю, или как я должен диагностировать ее?
Я нашел решение своей проблемы и при этом также понял, что мой заголовок для этого сообщения является на самом деле неправильным: crontab выполнялся, но проблема была то, что команды Python в рамках моего сценария крона были не выполняемый.
причина этого состояла в том, что crontab выполнялся с другим $PATH
переменная чем тогда, когда я выполнил свои команды непосредственно в консоли, описанной точно как в принятом другие ответы , я связался. Моя ошибка состояла в том, что я полностью неправильно понял $PATH
переменная; я думал, что это, как предполагалось, указало на исполняемый файл в моем проекте, тогда как в действительности это содержит пути к папкам, которые интерпретируют сценарии (как интерпретатор Python). Таким образом, мои сценарии не выполнялись, потому что крон не мог найти, что интерпретатор выполнил их. Очень глупая ошибка, которой, возможно, избежали путем чтения документации!
у меня не было абсолютно никаких проблем с django, django-кроном или Python.
Сводка: крон использовал другой путь. Добавленный путь стандартной среды (тип $PATH
в консоли для просмотра).