systemd Error: Failed to execute /bin/sh: Exec format error — Решение
При попытке запуска сервиса через systemctl start процесс мгновенно завершается с кодом ошибки status=203/EXEC, а в журнале journalctl -u <service> появляется запись: Failed to execute /bin/sh: Exec format error или Failed at step EXEC spawning /path/to/binary: Exec format error.
| Диагностический маркер | Значение ядра (errno) | Технический контекст |
|---|---|---|
status=203/EXEC | ENOEXEC (код 8) | Ядро не может распарсить магические байты заголовка файла |
| Шебанг скрипта (Shebang) | Windows CRLF (^M) | Интерпретатор пытается запустить несуществующий /bin/sh
|
| Архитектура ELF | x86_64 vs aarch64 | Попытка запуска бинарника иной процессорной архитектуры (например, в Docker multi-arch) |
| Блокировка монтирования | Флаг noexec в fstab | Файловая система запрещает выполнение любых исполняемых файлов |
- Сервис переходит в состояние
failed(Result: exit-code). - Прямой запуск скрипта из консоли возвращает:
/bin/sh: cannot execute binary file: Exec format error. - В контейнерных средах (Docker/Kubernetes) сбой происходит при развертывании x86 образов на ARM64 нодах (AWS Graviton, Apple Silicon).
- Проверьте тип файла и его архитектуру с помощью утилиты
file:file /path/to/your/script.sh file /path/to/your/binary - Если исполняемый файл является shell-скриптом, проверьте окончания строк на наличие скрытых символов возврата каретки
\r(CRLF):head -n 1 /path/to/your/script.sh | cat -A # Если вывод заканчивается на ^M$, удалите символы Windows: sudo sed -i 's/\r$//' /path/to/your/script.sh # Либо воспользуйтесь утилитой dos2unix: sudo apt install -y dos2unix && sudo dos2unix /path/to/your/script.sh - Убедитесь, что первая строка скрипта содержит валидный шебанг с абсолютным путем:
#!/usr/bin/env bash # или #!/bin/sh - Если файл — скомпилированный бинарник, сопоставьте архитектуру хоста и файла:
uname -m # Сравните с выводом команды file (например, x86-64 против aarch64) - Проверьте опции монтирования раздела, на котором расположен файл (отсутствие флага
noexec):
Если раздел смонтирован сfindmnt -T /path/to/your/script.shnoexec, измените параметры в/etc/fstabи перемонтируйте:sudo mount -o remount,exec /path. - Выполните перезагрузку демона systemd и запустите сервис:
sudo systemctl daemon-reload sudo systemctl restart <service_name>
.gitattributes с директивой * text eol=lf, чтобы предотвратить случайное преобразование окончаний строк в CRLF разработчиками на Windows.Частые вопросы (FAQ)
Что означает статус 203/EXEC в systemd?
Код ошибки 203/EXEC означает, что systemd не смог выполнить системный вызов execve() для указанного процесса. Это происходит из-за отсутствия прав на исполнение, неверного шебанга или несовместимого формата бинарного файла.
Почему скрипт с #!/bin/bash падает с ошибкой Exec format error?
Если скрипт редактировался в Windows, в конце строки шебанга появляется скрытый байт \r. Ядро пытается найти интерпретатор с именем '/bin/bash\r', которого нет в системе.
Как запустить x86_64 бинарник на ARM64 сервере без перекомпиляции?
Необходимо установить эмулятор QEMU User Space и зарегистрировать бинарные форматы через binfmt_misc (например, пакет qemu-user-static).
Может ли пустой файл вызывать ошибку Exec format error?
Да, если вы передаете путь к нулевому по размеру файлу в директиву ExecStart без указания интерпретатора, ядро вернет ENOEXEC.