Проблема с cronjob для запуска скрипта python на сервере ubuntu

Я установил python3, следуя руководству Digital Ocean, и запускал свои скрипты python только из командной строки, это bash, который я использую, и он работает:

    ~$ source /home/username/python_projects/project_name/bin/activate
    ~$ python3 /home/username/python_projects/project_name.py
    ~$ deactivate

если я помещу эти команды в crontab в том же порядке, ничего не произойдет.

    0 7 * * * source /home/username/python_projects/project_name/bin/activate
    0 7 * * * python3 /home/username/python_projects/project_name.py
    0 7 * * * deactivate

Что я делаю не так?

Cronjob активен и работает.

    ~$ systemctl status cron

Файл python имеет следующие разрешения:

    -rw-rw-r-- 1 user_name user_name 17075 Feb  7 02:30 python_projects/project_name.py

Вы не можете просто поместить команды в crontab вот так. Crontab использует специальный синтаксис, чтобы точно указать, когда запускать команды.

John Gordon 07.02.2023 03:03

Покажите нам фактический файл crontab, который вы используете.

John Gordon 07.02.2023 03:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Есть несколько вещей, которые могут привести к тому, что ваш cronjob не запустится:

Переменные среды: исходная команда в вашем задании cron настраивает виртуальную среду, но эта среда не передается процессу cron. Вы должны указать полный путь к исполняемому файлу Python в вашей виртуальной среде, например. /home/имя_пользователя/python_projects/имя_проекта/bin/python3.

Проблемы с разрешениями: убедитесь, что у пользователя cron есть разрешение на выполнение сценария и доступ к виртуальной среде.

Вывод: по умолчанию cron не отправляет вывод на терминал. Если ваш скрипт производит выходные данные, вы можете перенаправить их в файл для целей отладки. Вы можете сделать это, добавив > /tmp/output.log 2>&1 в конец записи crontab.

Вы можете проверить системные журналы на наличие сообщений об ошибках, связанных с вашим заданием cron. Журналы обычно находятся в /var/log/syslog или /var/log/messages.

Надеюсь, это поможет!

Ответ принят как подходящий

Задание activate запускается, затем завершается, а затем следующее задание cron ничего не знает о том, что оно сделало. Вы хотите запустить их все в одном процессе (хотя запускать deactivate в конце бессмысленно, так как все, что сделал activate, все равно будет стерто, когда задание завершится).

На практике вы можете запустить интерпретатор Python напрямую из виртуальной среды.

Что бы это ни стоило, сообщение об ошибке «MTA не установлено» означает, что вывод из cron был отброшен, потому что система не смогла понять, как отправить его по электронной почте. Вы, вероятно, захотите изменить правило записи вывода в файл.

0 7 * * * cd python_projects && ./project_name/bin/python3 project_name.py >>project_name.log 2>&1

Возможно, обратите внимание, что cron всегда начинается в вашем домашнем каталоге, поэтому вам не нужно указывать /home/username (при условии, конечно, что username — это пользователь, от которого crontab это запускается).

Другие вопросы по теме