SYSTEMD · 2026-11-11

Статус 203 у сервиса systemd — exec, который так и не запустился

Статус 203 у сервиса systemd: программа так и не запустилась. Три ошибки — одинаковый ответ; вторая строка журнала назовёт твою. Замерено, с лечением.

HUMANавтор @mrkeepalive1d6 мин чтения
unit-файлExecStart=… дверь 1 · поискstat пути дверь 2 · execveпуть + бит exec дверь 3shebang твой сервиснаконец запускается — он тут ни при чём A умирает у двери 1 · No such file or directoryB умирает у двери 2 · Permission denied — C умирает у двери 3 · No such file or directory (интерпретатор)
Рис. 1 — эстафета exec. status=203/EXEC — это палочка, упавшая у двери 1, 2 или 3; блок внизу так и не стартовал.

Что на самом деле означает статус 203/EXEC?

Главное предложение: status=203/EXEC — это systemd сообщает, что execve твоей команды ExecStart провалился в момент запуска — твоего процесса никогда не существовало, поэтому логика, конфиг и код самого сервиса тут ещё ни при чём. На стенде одноразовый oneshot-юнит, по очереди носивший каждую неисправность, печатал один и тот же вердикт каждый раз:

$ systemctl show bench203.service -p ExecMainCode -p ExecMainStatus -p Result
ExecMainCode=1
ExecMainStatus=203
Result=exit-code

проверка: ExecMainCode=1 — это CLD_EXITED, а 203 — статус выхода семейства exec; тот же юнит после лечения читается как ExecMainStatus=0 и Result=success (квитанция ниже).

Три разные ошибки, один номер

Три значения ExecStart, три запуска на одном и том же boot, с разницей в секунды. systemctl status — экран, который чаще всего читают, — различить их не смог:

Process: 703 ExecStart=/opt/bench203/no-such-binary (code=exited, status=203/EXEC)
Process: 778 ExecStart=/opt/bench203/worker.sh      (code=exited, status=203/EXEC)   # file exists, mode 0644
Process: 853 ExecStart=/opt/bench203/shebang.sh     (code=exited, status=203/EXEC)   # +x, interpreter missing

проверка: три запуска, три одинаковых хвоста status=203/EXEC — экран статуса показывает «что», никогда «который».

Народное лечение — переустановить программу или гонять юнит перезапусками по кругу. Петля перезапусков здесь и есть ложь: пациентом программа никогда не была. Вторая строка записи в журнале — та, что под Starting…, — и есть диагноз, и все три раза она разная:

bench203.service: Unable to locate executable '/opt/bench203/no-such-binary': No such file or directory
bench203.service: Unable to locate executable '/opt/bench203/worker.sh': Permission denied
bench203.service: Failed to execute /opt/bench203/shebang.sh: No such file or directory

проверка: скопировано дословно из journalctl -u bench203.service, по строке на неисправность, PIDs 703 / 778 / 853.

Какая из трёх твоя?

Читай вторую строку в два шага. Сначала фраза: Unable to locate executable говорит о твоём пути (сбой A или B); Failed to execute значит, что systemd прошёл твой файл и потерял нечто, что сам и называет, — интерпретатор в строке 1 (сбой C). Потом errno после двоеточия: No such file or directory против Permission denied разделяет A и B.

Формулировка сбоя B заслуживает отдельного предупреждения: Unable to locate executable … Permission denied обвиняет файл в несуществовании, пока файл лежит прямо там — 28 байт, режим 0644, никого не трогает. systemd файл нашёл; просто сказать этого в той фразе не может. Правда — в errno, а не в глаголе.

Aневерный путь — Unable to locate … No such file or directory: файла правда нет
Bнет бита exec — та же фраза Unable to locate, errno Permission denied: бит и есть недостающая деталь
Cсломанный shebang — Failed to execute … No such file or directory: твой файл в порядке, #!/usr/bin/bashh — нет

Как починить статус 203/EXEC?

Лечение на стенде — один chmod для формы B и честная строка 1 для формы C — без переустановок, без петли перезапусков:

sudo chmod 0755 /opt/bench203/worker.sh        # give back the exec bit
# and make line 1 of the script name a real interpreter:
#!/bin/bash
$ systemctl show bench203.service -p ExecMainStatus -p Result
ExecMainStatus=0
Result=success

проверка: журнал вылеченного запуска читается worker.sh[931]: worker ran → Deactivated successfully. → Finished bench203 fault shapes. — oneshot сделал своё дело и ушёл.

Сентябрьский сервис systemd не стартует: журнал уже назвал причину обещал то же самое для более тихой неудачи. 203 — тот же закон на самой громкой ноте: признание ложится в журнал ещё до того, как ты откроешь unit-файл.

Лечение, по порядку

Три признания одним взглядом

что говорит журналчего не хватаетлечение
Unable to locate executable … No such file or directoryсам путь ExecStartисправь путь — абсолютный, без опечаток
Unable to locate executable … Permission deniedбит исполненияsudo chmod +x /path/to/script
Failed to execute … No such file or directoryинтерпретатор из shebangисправь строку 1 (#!/bin/bash) или поставь интерпретатор
«203 — это не твой сервис умирает, это systemd не может вручить ему ключи. Журнал каждый раз называет, какой именно ключ.»
чего стенд не покрыл

Замерено: три формы сбоя (нет пути, режим 0644, сломанный shebang) на одной свежей VM Arch, systemd 262 (262.1-1-arch), oneshot-юнит, с разницей в секунды, плюс вылеченный запуск. Не замерено: относительный путь ExecStart — systemd отвергает его ещё на разборе со своим собственным сообщением, не 203 (публичная документация); отказы SELinux/AppArmor — они всплывают с тем же errno Permission denied — проверь свой LSM, прежде чем винить бит; пути ExecStart в chroot. Одна машина, один build: переносимая часть — правило чтения; вердикт — твоя собственная строка журнала.

СТЕНД, ПРОВЕРЕННЫЙ ВРУЧНУЮ · systemd 262 (262.1-1-arch) · свежая VM Arch · последний тест 2026-11-11

Один номер, три двери — и журнал, который называет дверь каждый раз. Читай вторую строку, прежде чем что-то перезапускать. ■