status=255/EXCEPTION в systemd
Код 255 systemd называет EXCEPTION, но приходит он обычно от самой программы: этим числом многие среды (в том числе оболочка) сообщают об аварийном завершении. Отдельно systemd использует его, когда передаёт наружу факт завершения по сигналу.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Программа сама вернула 255
Так поступают оболочка при завершении по сигналу, интерпретаторы при критической ошибке и многие сборки на Go и Node. Смысл кода определяет программа, а не systemd.
-
Команда запускалась через оболочку, и та передала код сигнала
При
ExecStart=/bin/sh -c ...оболочка возвращает 128 плюс номер сигнала, а в ряде случаев 255. Настоящая причина — в том, что случилось внутри. -
Ошибка в скрипте предварительной команды
Если
ExecStartPre=— скрипт сset -e, любая неудачная команда внутри может дать 255 в зависимости от оболочки.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Показывает, какой шаг вернул 255 — главный процесс или предварительная команда.
systemctl status myapp.service -l --no-pagerСообщения программы: код 255 сам по себе не объясняет ничего.
journalctl -u myapp.service -n 80 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Так поступают оболочка при завершении по сигналу, интерпретаторы при критической ошибке и многие сборки на Go и Node. Смысл кода определяет программа, а не systemd.
- Как проверить
-
Посмотрите её сообщения в журнале перед строкой systemd.
journalctl -u myapp.service -n 60 --no-pager
- Как исправить
- Разбирайтесь с сообщением программы: код тут лишь признак того, что она сочла ошибку фатальной.
- Почему происходит
- При
ExecStart=/bin/sh -c ...оболочка возвращает 128 плюс номер сигнала, а в ряде случаев 255. Настоящая причина — в том, что случилось внутри.
- Как проверить
-
Посмотрите, не через оболочку ли запускается служба.
systemctl cat myapp.service | grep ExecStart
- Как исправить
-
Запускайте программу напрямую, без
sh -c: тогда systemd увидит её настоящий код или сигнал.
- Почему происходит
- Если
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: нет правила, требуется терминал или пароль.
Источники
- exit-status.h: EXIT_EXCEPTION = 255 — используется для передачи аварийного завершения
-
systemd.exec(5)
Класс кода 255 в таблице кодов выхода. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на скрипте, завершившемся из-за отсутствующей команды.