SystemdDoctor
служба не работает коды скрипты

status=255/EXCEPTION в systemd

Код 255 systemd называет EXCEPTION, но приходит он обычно от самой программы: этим числом многие среды (в том числе оболочка) сообщают об аварийном завершении. Отдельно systemd использует его, когда передаёт наружу факт завершения по сигналу.

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

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

  1. Программа сама вернула 255

    Так поступают оболочка при завершении по сигналу, интерпретаторы при критической ошибке и многие сборки на Go и Node. Смысл кода определяет программа, а не systemd.

  2. Команда запускалась через оболочку, и та передала код сигнала

    При ExecStart=/bin/sh -c ... оболочка возвращает 128 плюс номер сигнала, а в ряде случаев 255. Настоящая причина — в том, что случилось внутри.

  3. Ошибка в скрипте предварительной команды

    Если ExecStartPre= — скрипт с set -e, любая неудачная команда внутри может дать 255 в зависимости от оболочки.

Диагностика

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

Показывает, какой шаг вернул 255 — главный процесс или предварительная команда.

systemctl status myapp.service -l --no-pager

Сообщения программы: код 255 сам по себе не объясняет ничего.

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

Решение

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

1. Программа сама вернула 255
Почему происходит
Так поступают оболочка при завершении по сигналу, интерпретаторы при критической ошибке и многие сборки на Go и Node. Смысл кода определяет программа, а не systemd.
Как проверить
Посмотрите её сообщения в журнале перед строкой systemd.
journalctl -u myapp.service -n 60 --no-pager
Как исправить
Разбирайтесь с сообщением программы: код тут лишь признак того, что она сочла ошибку фатальной.
2. Команда запускалась через оболочку, и та передала код сигнала
Почему происходит
При ExecStart=/bin/sh -c ... оболочка возвращает 128 плюс номер сигнала, а в ряде случаев 255. Настоящая причина — в том, что случилось внутри.
Как проверить
Посмотрите, не через оболочку ли запускается служба.
systemctl cat myapp.service | grep ExecStart
Как исправить
Запускайте программу напрямую, без sh -c: тогда systemd увидит её настоящий код или сигнал.
3. Ошибка в скрипте предварительной команды
Почему происходит
Если ExecStartPre= — скрипт с set -e, любая неудачная команда внутри может дать 255 в зависимости от оболочки.
Как проверить
Определите, какой именно шаг вернул код.
systemctl status myapp.service -l --no-pager | grep -E "Process:"
Как исправить
Добавьте в скрипт вывод о том, где он остановился, или разложите шаги на отдельные ExecStartPre= строки — тогда systemd назовёт упавший шаг.

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

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

× deploy.service - Deploy task
     Active: failed (Result: exit-code) since Mon 2026-09-15 10:45:03 MSK; 2s ago
    Process: 7100 ExecStart=/usr/local/bin/deploy.sh (code=exited, status=255/EXCEPTION)

deploy.sh[7100]: /usr/local/bin/deploy.sh: line 12: rsync: command not found
systemd[1]: deploy.service: Main process exited, code=exited, status=255/EXCEPTION

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

  • status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
  • status=127 в systemd: команда не найдена Код 127 без имени: оболочка не нашла команду. Появляется, когда ExecStart запускает скрипт или sh -c, а внутри команды нет.
  • signal=TERM (status=15/TERM) в systemd Процесс службы завершён сигналом TERM. Когда это нормальная остановка, а когда признак проблемы.
  • Argument list too long в службе или скрипте Список аргументов слишком длинный: подстановка имён файлов дала тысячи аргументов. Как переписать вызов.
  • Exec format error при запуске службы Ошибка формата исполняемого файла: не та архитектура, нет строки #!, повреждённый файл или попытка запустить не программу.
  • Failed with result 'exit-code' Состояние exit-code: служба завершилась с ненулевым кодом. Что это сообщение значит и где искать настоящую причину.
  • status=126 в systemd: файл не исполняется Код 126: команда найдена, но выполнить её нельзя. Отличие от 127 и от 203/EXEC, разбор причин.
  • sudo: user is not in the sudoers file Скрипт службы не может выполнить команду через sudo: нет правила, требуется терминал или пароль.

Источники