Что означает ошибка "Failed to start" в systemd
Когда systemd не может запустить службу, выводится сообщение:
Job for имя_службы.service failed because the control process exited with error code.
See 'systemctl status имя_службы.service' and 'journalctl -xe' for details.
Это означает, что управляющий процесс службы завершился с ненулевым кодом возврата или был убит сигналом. Ошибка возникает на этапе Start (не Load), то есть конфигурационный файл загружен, но выполнение основной команды (ExecStart) не удалось.
Причины возникновения
- Ошибка в конфигурационном файле службы (
.service): неверный путь к исполняемому файлу, опечатки в параметрах (ExecStart,User,WorkingDirectory). - Отсутствие зависимых служб или файлов: служба указана в
RequiresилиAfter, но зависимая служба не активна или конфиг не загружен. - Недостаточно прав: служба настроена на запуск от пользователя без необходимых прав доступа к файлам, сокетам или портам.
- Проблема с самим приложением: ошибка в коде, отсутствие библиотек, неверные аргументы командной строки.
- Конфликт ресурсов: порт уже занят другим процессом, недостаточно памяти или места на диске.
- Таймаут запуска: служба не уложилась в
TimeoutStartSec(по умолчанию 90 секунд).
Способ 1: Анализ статуса и логов (базовый)
Самый важный шаг — получить детали ошибки из systemd.
- Проверьте статус службы:
systemctl status имя_службы
В выводе ищите строкиActive: failed (result: exit-code)иProcess: ... ExecStart=.... Код завершения (например,code=exited, status=1/FAILURE) даст подсказку. - Изучите логи службы:
journalctl -u имя_службы -n 50 --no-pager
Это покажет последние 50 строк логов. ИщитеFailedилиerror. Для более широкого контекста:journalctl -xe --no-pager | grep имя_службы - Если статус показывает
control process exitedс кодом, попробуйте запустить команду изExecStartвручную (безsudo, если служба от обычного пользователя):/путь/к/исполняемому_файлу [аргументы]
Это часто выводит ошибку сразу (например, "Permission denied" или "No such file").
Способ 2: Проверка и исправление конфигурации
Конфигурационные ошибки — частая причина.
- Найдите файл службы:
systemctl status имя_службы | grep Loaded
Пример вывода:Loaded: loaded (/etc/systemd/system/имя_службы.service; enabled; vendor preset: enabled). Путь указан в скобках. - Откройте файл в текстовом редакторе (например,
sudo nano /etc/systemd/system/имя_службы.service) и проверьте:ExecStart: абсолютный путь к исполняемому файлу, аргументы корректны.WorkingDirectory: директория существует и доступна.User/Group: пользователь существует и имеет права.PermissionsStartOnly: еслиtrue, то толькоExecStartPreзапускается с правами root.Restart: еслиon-failure, systemd попытается перезапустить, но это не решит корневую проблему.
- После изменений перезагрузите конфигурацию systemd:
sudo systemctl daemon-reload - Проверьте синтаксис конфига:
systemd-analyze verify /etc/systemd/system/имя_службы.service
Команда покажет ошибки парсинга.
Способ 3: Проверка зависимостей и ресурсов
Служба может зависеть от других служб, сокетов или монтирований.
- Посмотрите зависимости:
systemctl list-dependencies имя_службы
Убедитесь, что всеRequiresиWantsслужбы активны (active). Если какая-то зависимая служба в состоянииfailed, исправьте её сначала. - Проверьте, не занят ли порт (если служба сетевой):
sudo ss -tulpn | grep :порт
Если порт занят другим процессом, либо измените порт в конфиге службы, либо остановите конфликтующий процесс. - Убедитесь в наличии места на диске и памяти:
df -h /путь/к/рабочей_директории free -h
Способ 4: Отладка приложения напрямую
Если проблема в самом приложении, а не в systemd.
- Запустите приложение вручную с теми же аргументами, что в
ExecStart. Добавьте опции отладки, если есть (например,--verbose,--debug). - Проверьте наличие библиотек:
Все пути должны вести к существующим файлам. Отсутствующие библиотеки нужно установить.ldd /путь/к/исполняемому_файлу - Если приложение требует окружение (переменные среды), убедитесь, что они заданы в
EnvironmentилиEnvironmentFileв конфиге службы. Для теста экспортируйте переменные вручную перед запуском.
Способ 5: Пересоздание службы или обновление ПО
Если служба устарела или конфиг повреждён.
- Для стандартных пакетов (установленных через
apt,dnf): переустановите пакет.sudo apt reinstall имя_пакета # Debian/Ubuntu sudo dnf reinstall имя_пакета # Fedora/CentOS
Это восстановит оригинальный файл службы в/lib/systemd/system/. - Если вы создавали службу вручную, проверьте права на файл:
ls -l /etc/systemd/system/имя_службы.service
Должно быть-rw-r--r--и владелецroot. После правок не забудьтеdaemon-reload. - Обновите systemd и перезагрузите систему (если подозреваете системную проблему):
sudo apt update && sudo apt upgrade systemd # Debian/Ubuntu sudo dnf upgrade systemd # Fedora/CentOS
После обновления выполнитеsudo systemctl daemon-reexec.
Профилактика
- Всегда проверяйте конфиги перед загрузкой: используйте
systemd-analyze verify. - Тестируйте команду вручную перед добавлением в службу.
- Указывайте абсолютные пути в
ExecStart,WorkingDirectory. - Настройте корректные права на файлы, которые использует служба.
- Мониторьте логи с помощью
journalctl -u имя_службы -fв реальном времени при тестовом запуске. - Устанавливайте разумные таймауты (
TimeoutStartSec,TimeoutStopSec) для долгих операций. - Используйте
Type=oneshotдля скриптов, которые завершаются, а не демонов.