Что означает ошибка service failed to start
Ошибка service failed to start в Linux (чаще всего в системах на базе systemd) означает, что менеджер служб не смог успешно запустить фоновый процесс (демон). Это состояние отображается в выводе команды systemctl status как active (failed) или inactive (dead). Типичный вывод:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2026-02-17 10:30:00 MSK; 1min 30s ago
Process: 1234 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=1/FAILURE)
В данном примере служба ssh завершилась с кодом ошибки 1/FAILURE на этапе ExecStartPre (предварительный скрипт). Конкретная причина всегда указывается в логах, которые необходимо изучать.
Причины возникновения
Ошибка запуска службы может быть вызвана следующими распространёнными причинами:
- Синтаксическая ошибка в конфигурационном файле службы (
.service). Неправильные параметры, отсутствие разделов, опечатки. - Отсутствие или недоступность исполняемого файла/скрипта, указанного в
ExecStartилиExecStartPre. Файл может быть удалён, перемещён или иметь неверные права. - Недостаточно прав для запуска. Служба может требовать привилегий (
RootDirectory=,CapabilityBoundingSet=), или пользователь, от которого она запускается (User=), не существует/не имеет доступа. - Конфликт ресурсов. Служба пытается занять уже используемый сетевой порт, файл, сокет или другой системный ресурс.
- Невыполненные зависимости. Указанные в
Requires=илиAfter=службы не запущены или завершились с ошибкой. - Ошибка в самом приложении. Программа, которую запускает служба, падает сразу после старта из-за неправильных параметров, повреждённых конфигов, отсутствия библиотек.
- Проблемы с сессией или окружением. Служба запускается в чистом окружении systemd, отсутствуют переменные, которые есть в пользовательской сессии.
Способы решения
Способ 1: Анализ логов через journalctl
Получите детальные логи службы, которые покажут точную причину сбоя.
- Найдите имя службы (например,
nginx,postgresql). - Выполните команду для просмотра логов с момента последней загрузки:
journalctl -u имя_службы -b - Ищите строки с
Failed,Error,permission denied,No such file or directory,Address already in use. Часто последние 10-20 строк лога содержат ключевую информацию.
Пример вывода для failing-службы:
Feb 17 10:30:01 host systemd[1]: Starting My App Service...
Feb 17 10:30:01 host myapp[1234]: Error: Cannot open config file /etc/myapp/config.yaml: No such file or directory
Feb 17 10:30:01 host systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE
Feb 17 10:30:01 host systemd[1]: myapp.service: Failed with result 'exit-code'.
Способ 2: Проверка и валидация конфигурационного файла
Убедитесь, что конфиг службы синтаксически корректен и пути верны.
- Просмотрите текущую конфигурацию:
systemctl cat имя_службы - Проверьте синтаксис файла (если вы его редактировали). Для systemd нет встроенного валидатора, но можно проверить, загружается ли он:
Если команда завершится без ошибок, синтаксис, скорее всего, верен.systemctl daemon-reload - Внимательно проверьте пути в директивах:
ExecStart=— абсолютный путь к исполняемому файлу или скрипту.WorkingDirectory=— рабочая директория (должна существовать).ConfigFile=или аналогичные параметры вашего приложения — указывают ли они на существующие файлы?
Способ 3: Проверка существования и прав на исполняемый файл
Удостоверьтесь, что бинарник/скрипт, который должна запустить служба, существует и доступен.
- Найдите путь из
ExecStartв конфиге. - Проверьте существование файла:
ls -la /полный/путь/к/исполняемому_файлу - Проверьте права:
- Файл должен иметь биты выполнения (
x) для пользователя/группы, от которой запускается служба (по умолчанию —root). - Пример правильных прав:
-rwxr-xr-xили-rwx--x--x. - Если служба запускается от отдельного пользователя (директива
User=), убедитесь, что у этого пользователя есть права на выполнение файла.
- Файл должен иметь биты выполнения (
Способ 4: Диагностика зависимостей и конфликтов
Убедитесь, что все необходимые службы запущены, и нет конфликтов ресурсов.
- Просмотрите зависимости в конфиге (
Requires=,After=,Wants=). Для каждой зависимой службы выполните:
Она должна быть в состоянииsystemctl status имя_зависимой_службыactive (running). - Если служба использует сетевой порт, проверьте, не занят ли он:
Если порт уже занят другой службой, измените порт в конфиге вашей службы или остановите конфликтующий процесс.sudo ss -tulpn | grep :номер_порта - Проверьте, не пытается ли служба дважды занять один и тот же ресурс (например, сокет в
/run/).
Способ 5: Запуск вручную для диагностики
Запустите команду, указанную в ExecStart, вручную от того же пользователя, что и служба. Это покажет ошибки напрямую в терминале.
- Определите пользователя (
User=в конфиге, если нет — по умолчаниюroot). - Если служба запускается от не-root пользователя, переключитесь на него:
sudo -u имя_пользователя -i - Выполните команду из
ExecStartвручную, добавив ключи отладки, если нужно (например,--verbose). - Ошибка, которая в логах systemd может быть сжата, при ручном запуске часто выводится подробно.
Способ 6: Пересоздание юнитов и очистка состояния
Если служба была удалена/перемещена, или state systemd "застрял".
- Удалите и пересоздайте символические ссылки на юнит:
sudo systemctl daemon-reload sudo systemctl reset-failed имя_службы # сбрасывает состояние failed - Попробуйте запустить снова:
sudo systemctl start имя_службы - Для служб, которые были полностью удалены, убедитесь, что нет "зомби"-файлов в
/etc/systemd/system/или/lib/systemd/system/. Удалите старые файлы и повторитеdaemon-reload.
Профилактика
- Всегда используйте
systemctl daemon-reloadпосле ручного редактирования файлов служб в/etc/systemd/system/или/lib/systemd/system/. - Проверяйте конфигурационные файлы приложений, на которые ссылается служба (например,
nginx -tдля Nginx,postgresql -tдля PostgreSQL). - Не запускайте службы от root без необходимости. Указывайте конкретного пользователя/группу в
User=иGroup=. Это уменьшает риски безопасности и проблемы с правами. - Следите за обновлениями системы. Обновления пакетов могут изменять конфигурационные файлы служб или исполняемые файлы. После обновления проверяйте статус критичных служб.
- Используйте
systemctl statusиjournalctlкак первые команды при любом сбое — они дают 80% информации о проблеме.