Exec format error при запуске службы
Сообщение Exec format error (номер 8, ENOEXEC) значит, что ядро нашло файл, но не поняло, как его выполнить. Обычно это скрипт без первой строки #!, программа под другую архитектуру или повреждённый файл.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Скрипт без строки
#!Ядро определяет интерпретатор по первой строке. Без неё текстовый файл не является исполняемым, сколько бы прав на нём ни стояло. В терминале скрипт может работать: там его подхватывает оболочка.
-
Программа собрана под другую архитектуру
Файл для x86-64 на машине aarch64 (и наоборот) выполнить нельзя. Частая история при переносе сборок между серверами и при загрузке готовых артефактов.
-
Файл повреждён или скачан не полностью
Обрыв загрузки, неполная распаковка, сохранение через буфер обмена. Начало файла не похоже ни на программу, ни на скрипт.
-
Строка
#!записана с переносом строки WindowsСимвол возврата каретки в конце первой строки становится частью пути к интерпретатору. Ядро ищет
/bin/bash\rи не находит — а на экране строка выглядит правильной.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Определяет, что это за файл: программа какой архитектуры, скрипт с каким интерпретатором, текст или мусор.
file /путь/к/программеПоказывает первую строку вместе с невидимыми символами: так видно возврат каретки.
head -1 /путь/к/скрипту | cat -AПодтверждает, что ошибка относится к шагу EXEC и к какому именно файлу.
journalctl -xeu myapp.service --no-pager -n 20Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
#!- Почему происходит
- Ядро определяет интерпретатор по первой строке. Без неё текстовый файл не является исполняемым, сколько бы прав на нём ни стояло. В терминале скрипт может работать: там его подхватывает оболочка.
- Как проверить
-
Посмотрите первую строку файла.
head -1 /usr/local/bin/myapp.sh | cat -A | head -1
- Как исправить
-
Добавьте первой строкой указание интерпретатора либо запускайте интерпретатор явно из unit-файла.
ExecStart=/bin/bash /usr/local/bin/myapp.sh
- Почему происходит
- Файл для x86-64 на машине aarch64 (и наоборот) выполнить нельзя. Частая история при переносе сборок между серверами и при загрузке готовых артефактов.
- Как проверить
-
Сравните архитектуру файла и машины.
file /usr/local/bin/myapp uname -m
- Как исправить
- Возьмите сборку под нужную архитектуру или соберите программу на этой машине.
- Почему происходит
- Обрыв загрузки, неполная распаковка, сохранение через буфер обмена. Начало файла не похоже ни на программу, ни на скрипт.
- Как проверить
-
Посмотрите тип и размер файла, сверьте контрольную сумму.
file /usr/local/bin/myapp && ls -l /usr/local/bin/myapp sha256sum /usr/local/bin/myapp
- Как исправить
- Скачайте файл заново и проверьте контрольную сумму до установки.
#! записана с переносом строки 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
Условия, при которых ядро отказывается выполнять файл. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на скрипте без #!, на файле другой архитектуры и на скрипте с переносами Windows.