Что означает ошибка systemd-failed-to-start
Ошибка Failed to start — это общий статус, который systemd присваивает службе (юниту), когда процесс её запуска завершился с ненулевым кодом возврата, превысил заданный таймаут или столкнулся с критической проблемой при инициализации. В выводе команды systemctl status она выглядит как:
● some-service.service - Some Service Description
Loaded: loaded (/etc/systemd/system/some-service.service; enabled; vendor preset: enabled)
Active: **failed** (Result: exit-code) since Thu 2026-02-15 10:30:00 MSK; 1min 30s ago
Process: 1234 ExecStart=/usr/bin/some-service (code=exited, status=1/FAILURE)
Ключевые флаги: Active: failed и Result: exit-code (или timeout). Эта ошибка блокирует работу сервиса и может помешать загрузке системы, если юнит критичен.
Причины возникновения
Причины носят конкретный технический характер:
- Некорректный конфигурационный файл юнита (
.service). Ошибки в секциях[Service](неверный путь вExecStart,ExecStartPre),[Install]или синтаксис. - Недостаток прав доступа. Служба пытается прочитать/записать в каталог, к которому у неё нет прав (например,
/var/log/app/), или запускается от неправильного пользователя (User=). - Конфликт ресурсов. Порт уже занят другим процессом, недостаточно памяти (OOM Killer), не хватает дескрипторов файлов.
- Зависимости не выполнены. Указанные в
Requires=илиAfter=службы не запустились или завершились с ошибкой. - Повреждение бинарного файла или зависимостей приложения. Файл, указанный в
ExecStart, отсутствует, неисправен или не может загрузить нужные библиотеки. - Превышение таймаута. Приложение долго не отвечает на запросы инициализации, и systemd убивает его по истечении
TimeoutStartSec=(по умолчанию 90 сек).
Способы решения
Способ 1: Анализ логов службы через journalctl
Это первый и самый важный шаг. Логи systemd содержат детальный вывод программы.
- Узнайте точное имя службы (например,
nginx.service). - Выполните команду для просмотра логов за текущую загрузку:
journalctl -u nginx.service -b --no-pager - Внимательно изучите последние 20-30 строк. Ищите слова Failed, Error, (code=exited, status=...), Permission denied, No such file or directory.
- Если лог обширный, фильтруйте по уровню ошибки:
journalctl -u nginx.service -b -p err --no-pager
💡 Совет: Добавьте флаг
-eдля открытия лога сразу в конце, или-fдля отслеживания в реальном времени при перезапуске службы.
Способ 2: Проверка и исправление конфигурационного файла
Ошибки в юнит-файле — частая причина.
- Найдите файл службы:
systemctl status nginx.service | grep Loaded # Вывод: Loaded: loaded (/etc/systemd/system/nginx.service; enabled; ...) - Проверьте синтаксис:
Команда покажет строку с ошибкой, если она есть (например, "Invalid command 'Execstar', not part of a unit configuration").sudo systemd-analyze verify /etc/systemd/system/nginx.service - Откройте файл в редакторе (
sudo nano /etc/systemd/system/nginx.service) и проверьте:- Пути в
ExecStart,ExecStartPre: существуют ли они? (which some-binaryилиls -la /path/to/file) - Права на исполняемый файл (
ls -l /usr/bin/some-binary— должен быть-rwxr-xr-x). - Секцию
[Service]: правильно ли указаныUser=иGroup=? Существует ли такой пользователь/группа? - Директиву
WorkingDirectory=: существует ли каталог?
- Пути в
- После исправлений выполните:
sudo systemctl daemon-reload
Способ 3: Проверка зависимостей и конфликтов портов/ресурсов
- Проверьте, не занят ли порт (если служба сетевая):
Если порт занят другим процессом, найдите и остановите его или измените порт в конфиге службы.sudo ss -tulpn | grep :80 # Замените 80 на порт вашей службы - Проверьте, все ли требуемые службы работают:
Это покажет, какие службы зависят от nginx. Убедитесь, что они в состоянииsystemctl list-dependencies nginx.service --reverseactive (running). - Проверьте наличие свободных ресурсов:
Недостаток любого ресурса может привести к падению службы при старте.free -h # Память df -h /var # Дисковое пространство (особенно для логов) ulimit -n # Лимит дескрипторов файлов (может быть мал)
Способ 4: Восстановление из пакета или ручная переустановка
Если служба установлена из пакетного менеджера (apt, dnf, yum), её конфигурация могла быть повреждена.
- Debian/Ubuntu:
Это восстановит файлы изsudo apt update sudo apt install --reinstall nginx # Замените nginx на имя пакета/usr/share/doc/nginx/examples/или оригинальные конфиги в/etc/. - RHEL/CentOS/Fedora:
sudo dnf reinstall nginx - После переустановки не перезаписывайте свои кастомные настройки в
/etc/nginx/nginx.conf(если они были), если пакетный менеджер спросит. Сравните старый и новый файлы конфигурации юнита (/lib/systemd/system/nginx.servicevs/etc/systemd/system/nginx.service). Часто правильнее скопировать свои правки в новый оригинальный файл, а не использовать старый повреждённый.
Профилактика
- Всегда проверяйте синтаксис конфигурационных файлов службы и самого приложения (например,
nginx -t) перед перезагрузкой systemd. - Используйте
systemctl daemon-reloadпосле любого изменения файла юнита в/etc/systemd/system/или/lib/systemd/system/. - Настраивайте разумные таймауты (
TimeoutStartSec=,TimeoutStopSec=) для долгих служб, чтобы избежать ложных срабатываний. - Следите за правами на каталоги, с которыми работает служба (
/var/log/,/var/lib/,/run/). Рекомендуется создавать отдельного пользователя/группу для каждой службы. - Периодически проверяйте логи на предмет предупреждений (
journalctl -u <служба>.service -p warning) до того, как они превратятся в ошибки.
Способ N: Откат к предыдущей рабочей конфигурации (если используется Git)
Если конфигурационные файлы службы находятся под контролем версий (что хорошая практика):
- Определите, когда служба последний раз работала:
sudo journalctl -u nginx.service -b --no-pager | grep -i "started\|failed" - Найдите коммит, после которого начались сбои:
cd /etc/systemd/system/ git log --oneline -p -- nginx.service - Временно верните предыдущую версию файла:
sudo git checkout <хэш_коммита> -- nginx.service sudo systemctl daemon-reload sudo systemctl restart nginx.service - Если это помогло, проанализируйте, какие именно изменения сломали службу, и внесите их более аккуратно.
Способ N+1: Запуск службы вручную для отладки
Иногда systemd "затыкает" вывод ошибки. Запустите исполняемый файл напрямую от того же пользователя, под которым работает служба.
- Узнайте пользователя из юнит-файла (
User=) или из лога. - Выполните:
Флагиsudo -u <пользователь> /usr/bin/some-service --verbose # или, если служба запускает скрипт: sudo -u <пользователь> /bin/bash -x /path/to/startup-script.sh--verboseили-x(для bash) дадут подробный вывод. Часто ошибка становится очевидной при прямом запуске.