#Что происходит и когда это важно
После старта служба немедленно падает с status=203/EXEC; программа внутри скрипта не успевает показать свои сообщения. Отдельно проверяйте код 127, если интерпретатор запустился, но не нашёл команду.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверен путь к исполняемому файлуExecStart указывает старое расположение программы. | ls по пути сообщает No such file. | Исправить точный абсолютный путь. |
| Скрипт не имеет подходящего shebangЯдро не понимает, каким интерпретатором открыть файл. | В первой строке нет #! или указан несуществующий интерпретатор. | Проверить строку и существование программы. |
| Запрет исполненияНедостаточны x-права, noexec или политики доступа. | Файл существует, но в журнале Permission denied. | Различить права, mount и защиту, не применять chmod 777. |
| CRLF в shebangСкрипт перенесён из Windows с окончаниями CRLF. | Интерпретатор выглядит как /bin/bash^M. | Преобразовать окончания строк после резервной копии. |
#Пошаговая диагностика и исправление
- Сверьте реальный ExecStartОткройте терминал. Выполните
systemctl cat ИМЯ.serviceиsystemctl show ИМЯ.service -p ExecStart; запишите полный путь. systemd не запускаетExecStart=через оболочку по умолчанию:&&, перенаправления и переменные не всегда работают как в интерактивном Bash. - Изучите ошибку процессаВыполните
systemctl status ИМЯ.service --no-pagerиjournalctl -u ИМЯ.service -b -n 60 --no-pager. Убедитесь, что код 203/EXEC, а не ошибка приложения с другим кодом. Запишите точное сообщение о файле. - Проверьте существование и праваДля реального пути выполните
ls -l /ПУТЬ/К/СКРИПТУ. Вывод должен содержать файл и биты исполнения, если требуется прямой запуск. Далееnamei -l /ПУТЬ/К/СКРИПТУпозволяет увидеть доступ к родительским каталогам (если команда доступна). Не меняйте владельцев рекурсивно. - Сверьте первую строку скриптаЕсли ExecStart указывает на скрипт, посмотрите только первую строку командой
head -n 1 /ПУТЬ/К/СКРИПТУ. Для shell-скрипта обычна#!/bin/shили#!/usr/bin/env bashпри наличии интерпретатора.file /ПУТЬ/К/СКРИПТУпокажет формат и возможные CRLF. Не пытайтесь исполнять неизвестный скрипт от root ради проверки. - Проверьте файловую систему и безопасностьЕсли указан правильный файл и есть исполняемый бит, выполните
findmnt -T /ПУТЬ/К/СКРИПТУ. Опцияnoexecзапрещает прямое выполнение на томе; это может быть преднамеренная мера безопасности. Не снимайтеnoexecсо всего тома автоматически. - Исправьте только подтверждённую причинуДля своего скрипта создайте резервную копию, поправьте shebang/конец строки или переместите файл в предусмотренный исполняемый каталог по согласованию. Если ошибка только в пути ExecStart, используйте
sudo systemctl edit ИМЯ.service: в[Service]сначала пустойExecStart=, затем новая правильная абсолютная команда. Не изменяйте пакетный unit на месте. - Перечитайте и проверьтеАдминистратор выполнит
sudo systemctl daemon-reload, затем согласованный restart. Проверьте status и функциональность приложения. Если ошибка осталась, верните прежнее переопределение и сохраните журнал.
#Команды из инструкции с пояснениями
systemctl show ИМЯ.service -p ExecStartls -l /ПУТЬ/К/СКРИПТУhead -n 1 /ПУТЬ/К/СКРИПТУfindmnt -T /ПУТЬ/К/СКРИПТУ#Как проверить результат
203/EXEC исчез, служба запускает именно нужный исполняемый файл и выполняет полезное действие без расширения прав системы.
#Если проблема не устранена
Если ошибка не связана с путём, правами или shebang, рассмотрите неподходящую архитектуру бинарного файла, отсутствующий динамический загрузчик или SELinux/AppArmor по сообщениям журнала.