Когда Python скрипт не запускается на сервере, локально он может работать идеально, а на VPS падать без понятного сообщения. Причина почти всегда в окружении.
Так могут остановиться парсеры, рассылки, интеграции, отчеты, обработка файлов и любые автоматические задачи, которые должны работать по расписанию.
Коротко: нужно проверить интерпретатор, virtualenv, зависимости, права, рабочую директорию и логи запуска.Почему это ломается
Скрипт не стартует из-за другой версии Python, отсутствующих pip-пакетов, неактивированного venv, неправильного shebang, запрета на выполнение файла, относительных путей, отсутствующих env-переменных или запуска из cron с другой директорией.
Что проверяю в первую очередь
- какой python запускается на сервере
- установлены ли зависимости в нужном окружении
- есть ли права на запуск и чтение файлов
- что пишет скрипт при ручном запуске
- как он запускается из cron или systemd
Как я это чиню
Я сначала запускаю скрипт вручную тем же пользователем и тем же Python, которым он должен работать в автоматическом режиме.
- настраиваю virtualenv и зависимости
- исправляю пути и рабочую директорию
- добавляю env-переменные в cron или systemd
- настраиваю права файлов и папок
- добавляю логирование stdout и stderr
Что подготовить перед обращением
- сам скрипт или путь к нему
- как его нужно запускать
- текст ошибки
- доступ к серверу
- список нужных внешних сервисов или файлов
Как выглядит нормальный результат
Скрипт должен запускаться вручную и по расписанию одинаково, писать понятные логи и не зависеть от случайного окружения shell-сессии.
Чего лучше не делать
Не устанавливайте пакеты глобально без необходимости. Лучше использовать отдельное окружение проекта, чтобы не ломать другие скрипты.
Вопросы и ответы
Почему в терминале работает, а cron нет?
Cron запускается с другим окружением, путями и переменными. Нужно прописывать абсолютные пути и env.
Что лучше: cron или systemd timer?
Для простых периодических задач достаточно cron, для долгих сервисов лучше systemd.
Можно ли запускать несколько Python-скриптов с разными зависимостями?
Да, лучше делать отдельные virtualenv для разных проектов.
Почему ошибка ModuleNotFoundError?
Пакет установлен не в том окружении или скрипт запускается другим Python.
Нужна похожая задача?
Напишите в Telegram @rabotator_support или оставьте заявку на сайте. Коротко опишите проблему, приложите ссылку, скриншот или лог ошибки, и я подскажу, с чего безопасно начать исправление.
Итог
Python на сервере требует воспроизводимого окружения: интерпретатор, venv, зависимости, пути, права и логи должны быть заданы явно.