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

Exec format error при запуске службы

Сообщение Exec format error (номер 8, ENOEXEC) значит, что ядро нашло файл, но не поняло, как его выполнить. Обычно это скрипт без первой строки #!, программа под другую архитектуру или повреждённый файл.

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

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

  1. Скрипт без строки #!

    Ядро определяет интерпретатор по первой строке. Без неё текстовый файл не является исполняемым, сколько бы прав на нём ни стояло. В терминале скрипт может работать: там его подхватывает оболочка.

  2. Программа собрана под другую архитектуру

    Файл для x86-64 на машине aarch64 (и наоборот) выполнить нельзя. Частая история при переносе сборок между серверами и при загрузке готовых артефактов.

  3. Файл повреждён или скачан не полностью

    Обрыв загрузки, неполная распаковка, сохранение через буфер обмена. Начало файла не похоже ни на программу, ни на скрипт.

  4. Строка #! записана с переносом строки Windows

    Символ возврата каретки в конце первой строки становится частью пути к интерпретатору. Ядро ищет /bin/bash\r и не находит — а на экране строка выглядит правильной.

Диагностика

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

Определяет, что это за файл: программа какой архитектуры, скрипт с каким интерпретатором, текст или мусор.

file /путь/к/программе

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

head -1 /путь/к/скрипту | cat -A

Подтверждает, что ошибка относится к шагу EXEC и к какому именно файлу.

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

Решение

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

1. Скрипт без строки #!
Почему происходит
Ядро определяет интерпретатор по первой строке. Без неё текстовый файл не является исполняемым, сколько бы прав на нём ни стояло. В терминале скрипт может работать: там его подхватывает оболочка.
Как проверить
Посмотрите первую строку файла.
head -1 /usr/local/bin/myapp.sh | cat -A | head -1
Как исправить
Добавьте первой строкой указание интерпретатора либо запускайте интерпретатор явно из unit-файла.
ExecStart=/bin/bash /usr/local/bin/myapp.sh
2. Программа собрана под другую архитектуру
Почему происходит
Файл для x86-64 на машине aarch64 (и наоборот) выполнить нельзя. Частая история при переносе сборок между серверами и при загрузке готовых артефактов.
Как проверить
Сравните архитектуру файла и машины.
file /usr/local/bin/myapp
uname -m
Как исправить
Возьмите сборку под нужную архитектуру или соберите программу на этой машине.
3. Файл повреждён или скачан не полностью
Почему происходит
Обрыв загрузки, неполная распаковка, сохранение через буфер обмена. Начало файла не похоже ни на программу, ни на скрипт.
Как проверить
Посмотрите тип и размер файла, сверьте контрольную сумму.
file /usr/local/bin/myapp && ls -l /usr/local/bin/myapp
sha256sum /usr/local/bin/myapp
Как исправить
Скачайте файл заново и проверьте контрольную сумму до установки.
4. Строка #! записана с переносом строки Windows
Почему происходит
Символ возврата каретки в конце первой строки становится частью пути к интерпретатору. Ядро ищет /bin/bash\r и не находит — а на экране строка выглядит правильной.
Как проверить
Проверьте наличие символов возврата каретки.
file /usr/local/bin/myapp.sh
head -1 /usr/local/bin/myapp.sh | cat -A
Как исправить
Переведите файл в перенос строк Unix.
sed -i "s/\r$//" /usr/local/bin/myapp.sh

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

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

× myapp.service - My application
     Active: failed (Result: exit-code) since Mon 2026-09-15 13:02:19 MSK; 1s ago
    Process: 6210 ExecStart=/usr/local/bin/deploy.sh (code=exited, status=203/EXEC)

systemd[6210]: myapp.service: Failed at step EXEC spawning /usr/local/bin/deploy.sh: Exec format error
systemd[1]: myapp.service: Main process exited, code=exited, status=203/EXEC

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

  • status=203/EXEC в systemd Код 203/EXEC означает, что systemd не смог выполнить программу из ExecStart=. Разбор причин: путь, права, интерпретатор, синтаксис оболочки.
  • signal=ILL (status=4/ILL) в systemd Процесс службы завершён сигналом ILL: недопустимая инструкция процессора. Обычно сборка не под этот процессор.
  • status=126 в systemd: файл не исполняется Код 126: команда найдена, но выполнить её нельзя. Отличие от 127 и от 203/EXEC, разбор причин.
  • No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
  • Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
  • Job for … failed because a timeout was exceeded Задание на запуск прервано по таймауту. Как отличить медленный старт от заблокированного и правильно настроить TimeoutStartSec.
  • Python-служба: ModuleNotFoundError при запуске Служба не находит модули: другое виртуальное окружение, неверный интерпретатор, отсутствующие зависимости.
  • status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.

Источники

  • execve(2): ошибка ENOEXEC
    Условия, при которых ядро отказывается выполнять файл.
    документация программы
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено на скрипте без #!, на файле другой архитектуры и на скрипте с переносами Windows.
    собственная проверка, systemd 255
    сверено 15 сентября 2026