SystemdDoctor
служба не работает java запуск

Java-служба не запускается: не найдена среда исполнения

Классическая ошибка для служб на JVM: в команде запуска указано имя java без пути, либо путь ведёт на удалённую при обновлении версию. systemd не ищет программу в PATH, и запуск завершается сразу.

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

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

  1. Имя java без полного пути

    systemd не использует PATH при запуске. Имя команды для него — несуществующий путь.

  2. Среда исполнения удалена или обновлена

    После обновления пакета каталог версии меняется. Жёстко прописанный путь перестаёт существовать.

  3. Переменная с каталогом среды исполнения не передана

    Часть приложений требует переменную с путём к среде исполнения. В профиле она есть, у службы — нет.

Диагностика

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

Команда запуска и окружение.

systemctl cat myapp.service | grep -E "^Exec|^Environment"

Фактический путь к среде исполнения.

readlink -f "$(command -v java)"

Шаг и причина отказа запуска.

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

Решение

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

1. Имя java без полного пути
Почему происходит
systemd не использует PATH при запуске. Имя команды для него — несуществующий путь.
Как проверить
Посмотрите команду запуска и настоящий путь.
systemctl cat myapp.service | grep ExecStart
command -v java; readlink -f "$(command -v java)"
Как исправить
Укажите полный путь к java. Ссылки, ведущие на текущую версию, надёжнее конкретного каталога: они переживают обновления.
2. Среда исполнения удалена или обновлена
Почему происходит
После обновления пакета каталог версии меняется. Жёстко прописанный путь перестаёт существовать.
Как проверить
Проверьте путь из команды запуска.
ls -l /usr/lib/jvm/ 2>/dev/null | head
Как исправить
Используйте ссылку на текущую версию или задавайте путь через переменную окружения в файле окружения.
3. Переменная с каталогом среды исполнения не передана
Почему происходит
Часть приложений требует переменную с путём к среде исполнения. В профиле она есть, у службы — нет.
Как проверить
Посмотрите окружение службы.
systemctl show myapp.service -p Environment | tr " " "\n" | grep -i java
Как исправить
Задайте переменную в unit-файле или в файле окружения: служба не читает профиль оболочки.

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

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

× myapp.service - Java application
    Process: 4100 ExecStart=java -jar /opt/myapp/app.jar (code=exited, status=203/EXEC)
systemd[4100]: myapp.service: Failed at step EXEC spawning java: No such file or directory

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

Источники

  • systemd.service(5)
    Требование абсолютного пути в Exec*=.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено командой запуска без полного пути к java.
    собственная проверка, systemd 255
    сверено 15 сентября 2026