Job for service failed exited with error code — Решение сбоя systemd
Архитектура ошибки и симптомы сбоя
Сообщение «Job for service failed because the control process exited with error code. See "systemctl status service.service" and "journalctl -xeu service.service" for details» генерируется диспетчером systemd. Ошибка указывает на то, что один из управляющих процессов юнита (ExecStartPre=, ExecStart=, ExecStartPost=, ExecStop= или ExecReload=) завершился с ненулевым кодом выхода (Exit Code). Служба признается неисправной и не переходит в активное состояние active (running).
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| Control Process | ExecStart / ExecStartPre | Вспомогательный или основной бинарный файл, запущенный systemd для инициализации службы. |
| Exit Code | 1, 2, 127, 203, etc. | Стандартный код возврата POSIX: 127 (файл не найден), 203 (EXEC failed) и др. |
| Unit State | failed / activating | Конечное состояние юнита после сбоя управляющего процесса. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Просмотр точной причины сбоя через journalctl
Стандартный вывод systemctl status скрывает детали. Используйте детальный журнал:
# Просмотр полных логов конкретного сервиса за текущую загрузку с пояснениями:
sudo journalctl -xeu service_name.service --no-pager
# Проверка последних строк статуса юнита:
sudo systemctl status service_name.service -lСценарий 2: Расшифровка распространенных системных кодов возврата systemd
- status=203/EXEC: Бинарный файл по указанному пути не существует либо у него нет прав на исполнение (
chmod +x). - status=217/USER: Пользователь или группа, указанные в
User= / Group=, не существуют в/etc/passwd. - status=127: Отсутствует динамическая библиотека (проверьте через
ldd /path/to/binary). - status=1/FAILURE: Внутренняя ошибка конфигурации сервиса (ошибка в файле .conf, занят порт, нет прав).
Сценарий 3: Проверка синтаксиса конфигурационных файлов приложения
Большинство служб падают на старте из-за опечаток в своих конфигурационных файлах:
# Nginx:
sudo nginx -t
# Apache:
sudo apachectl configtest
# PostgreSQL / MySQL:
sudo -u postgres postgres -D /var/lib/postgresql/data -C config_fileСценарий 4: Ручной тестовый запуск команды из ExecStart
Запустите команду из секции ExecStart= вручную от имени того же пользователя:
# Узнайте точную команду ExecStart:
systemctl show service_name.service -p ExecStart -p User
# Запустите от имени сервисного пользователя:
sudo -u service_user /usr/bin/binary --config /etc/app.confITSTM выполнит экспресс-аудит журналов systemd, исправление конфигураций сервисов и прав доступа в течение 30 минут.
Частые вопросы (FAQ)
Почему systemctl не показывает подробный текст ошибки сразу?
systemd — это системный менеджер процессов, он регистрирует только сам факт завершения процесса и код возврата. Текстовые логи стандартного вывода (stdout/stderr) процесса передаются в журнал systemd-journald, который просматривается через journalctl -u <unit>.
Что означает ошибка 'status=226/NAMESPACE' в systemd?
Она указывает на ошибку изоляции файловой системы (директивы ProtectSystem=, ProtectHome=, ReadOnlyPaths=). Служба не смогла создать изолированный mount namespace из-за отсутствия указанного каталога.
Как перезагрузить systemd после правки unit-файла?
После любого изменения файлов в /etc/systemd/system/ обязательно выполните команду: sudo systemctl daemon-reload.
Как временно проигнорировать ошибку в ExecStartPre?
Поставьте знак минус перед командой: ExecStartPre=-/path/to/script.sh. Знак '-' указывает systemd продолжать запуск службы даже при ненулевом коде возврата этой команды.