SystemdDoctor
служба не работает python окружение

Служба на Python не находит зависимости

Окружение Python — это не только каталог с пакетами, но и свой интерпретатор. Указание системного интерпретатора в unit-файле означает запуск без пакетов окружения, и служба падает на импорте — хотя в терминале после активации окружения всё работает.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Указан системный интерпретатор

    Системный интерпретатор не видит пакеты окружения. Импорт отказывает.

  2. Окружение создано для другой версии интерпретатора

    После обновления системного интерпретатора окружение может перестать работать: ссылки внутри указывают на исчезнувшую версию.

  3. Изоляция службы закрывает путь к окружению

    Параметры защиты системы делают каталог недоступным, и запуск отказывает с кодом исполнения.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Какой интерпретатор запускается на самом деле.

systemctl show myapp.service -p ExecStart

Версия интерпретатора окружения.

/opt/myapp/venv/bin/python -V 2>&1

Сообщение об ошибке импорта.

journalctl -u myapp.service -n 20 --no-pager

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Указан системный интерпретатор
Почему происходит
Системный интерпретатор не видит пакеты окружения. Импорт отказывает.
Как проверить
Посмотрите команду запуска и наличие пакета в обоих интерпретаторах.
systemctl show myapp.service -p ExecStart
/opt/myapp/venv/bin/python -c "import flask" 2>&1 | tail -1
Как исправить
Укажите в команде запуска интерпретатор из окружения по полному пути. Активация окружения в unit-файле не нужна и не работает.
[Service]
ExecStart=/opt/myapp/venv/bin/python -m myapp
2. Окружение создано для другой версии интерпретатора
Почему происходит
После обновления системного интерпретатора окружение может перестать работать: ссылки внутри указывают на исчезнувшую версию.
Как проверить
Посмотрите, куда ведёт интерпретатор окружения.
ls -l /opt/myapp/venv/bin/python*; /opt/myapp/venv/bin/python -V 2>&1
Как исправить
Пересоздайте окружение под текущую версию интерпретатора и установите зависимости заново. Починить ссылки на месте обычно не удаётся.
3. Изоляция службы закрывает путь к окружению
Почему происходит
Параметры защиты системы делают каталог недоступным, и запуск отказывает с кодом исполнения.
Как проверить
Посмотрите параметры изоляции и доступность пути.
systemctl show myapp.service -p ProtectSystem -p ProtectHome -p ReadOnlyPaths
sudo -u myapp test -x /opt/myapp/venv/bin/python && echo доступен || echo недоступен
Как исправить
Разрешите нужный путь в параметрах изоляции. Окружение в домашнем каталоге пользователя особенно часто попадает под защиту домашних каталогов.

Пример вывода

В unit-файле указан системный интерпретатор. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

systemd[1]: Started myapp.service - My application.
python3[12500]: Traceback (most recent call last):
python3[12500]:   File "/opt/myapp/app.py", line 1, in <module>
python3[12500]: ModuleNotFoundError: No module named 'flask'
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE

Связанные ошибки

Источники

  • systemd.service(5)
    ExecStart= и запуск по полному пути.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено unit-файлом с системным интерпретатором при пакетах в окружении.
    собственная проверка, systemd 255
    сверено 15 сентября 2026