#Что означает ошибка
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.
Сообщение «Failed to start …service» в systemd означает, что служба запустилась и сразу завершилась с ошибкой либо не смогла стартовать из-за зависимости. Сама фраза ничего не объясняет — причина всегда записана в журнале службы, и работать нужно именно с ним.
Типичные причины: ошибка в конфигурации службы, занятый порт, неверные права на файлы, отсутствующий бинарник, нехватка памяти или места на диске, а также неправильный unit-файл после ручной правки.
systemd запускает службу командой из unit-файла и следит за её завершением. Если процесс завершился с ошибкой или не запустился за отведённое время, служба переходит в состояние failed.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Ошибка в конфигурации службыНеверный синтаксис или параметр в конфигурационном файле. | В журнале строка с указанием файла и номера строки. | Исправьте конфигурацию, проверьте её командой самой программы (например, nginx -t). |
| Порт или ресурс уже занятДругой процесс слушает тот же порт. | В журнале Address already in use. | Найдите процесс ss -ltnp, остановите лишний. |
| Нет прав или не найден файлНет доступа к каталогу, сертификату, сокету. | В журнале Permission denied или No such file or directory. | Проверьте права и пути. |
Ошибка в unit-файле или зависимостиНеверный ExecStart, не запущена зависимая служба. | systemctl status показывает code=exited или Dependency failed. | Проверьте unit-файл (systemctl cat), выполните systemctl daemon-reload. |
#Пошаговое решение
- Посмотрите статусОткройте терминал сервера и выполните
systemctl status имя.service --no-pager -l, подставив точное имя из сообщенияFailed to start. ПосмотритеActive,Result,ExecStartиstatus=...; отсутствие процесса не говорит, что виноват сам systemd. - Прочитайте журналПолучите журнал именно этой службы командой
sudo journalctl -u имя.service -b -n 100 --no-pagerи найдите первую ошибку до сообщения о выходе. Если указан файл конфигурации, порт, каталог или пользователь, проверьте соответствующий объект; не правьте незнакомые сервисы без копии. - Проверьте конфигурациюЕсли у программы есть средство проверки настроек (например,
nginx -t,apachectl configtest,php-fpm -t), выполните его до повторного запуска. Сравните фактическийExecStartчерезsystemctl cat имя.serviceс путями к исполняемому файлу; запуск несуществующего файла выдаёт специфический код 203/EXEC. - Проверьте порт и праваЕсли журнал сообщает
Address already in use, проверьте владельца порта командойsudo ss -ltnp; еслиPermission denied, посмотрите права и пользователя службыsystemctl show имя.service -p User,Group. Не убивайте посторонние процессы и не давайте файлам 777. - Замените
nginxна имя вашей службыLinux · Терминал (Bash)КомандаНужен sudoЗаменитеnginxна имя вашей службы. Команды только читают состояние.systemctl status nginx.service --no-pagerjournalctl -xeu nginx.service --no-pager | tail -n 40sudo ss -ltnp | grep ":80 " - Перезагрузите unit и запуститеПосле точечного исправления выполните
sudo systemctl daemon-reloadлишь если изменён unit-файл, затемsudo systemctl start имя.serviceи проверьтеsystemctl statusплюс журнал. Если служба снова падает, соберите её выходной код и новую ошибку; не увеличивайте бесконечноRestartSec.
#Если не помогло
Если служба падает сразу после запуска и сообщений мало, запустите её программу вручную в консоли (команда из ExecStart) от нужного пользователя и посмотрите вывод. Для диагностики зависимостей используйте systemctl list-dependencies.
#Как читать журнал
Команда journalctl -xeu имя.service -n 80 --no-pager показывает последние строки с пояснениями. Ищите слова error, permission denied, address already in use, No such file, exit-code. Код status=203/EXEC значит, что бинарник не найден или не исполняемый, status=217/USER — пользователь из unit-файла не существует, status=200/CHDIR — каталог не найден.
#Ошибки в unit-файле
После любой правки файла службы выполните sudo systemctl daemon-reload, иначе systemd использует старую версию. Проверить синтаксис можно командой systemd-analyze verify /etc/systemd/system/имя.service. Путь в ExecStart должен быть абсолютным, а при запуске скрипта у него должен быть бит исполнения: chmod +x.
systemctl status имя.service -ljournalctl -xeu имя.service -n 80 --no-pager