Краткий ответ
Когда служба systemd не запускается, сначала проверьте статус командой `systemctl status имя-службы` и просмотрите журналы с помощью `journalctl -u имя-службы`. Причиной может быть ошибка в конфигурации, отсутствующий файл, неправильные разрешения или неудачная зависимость. Следуйте шагам для систематической диагностики.
Как проявляется проблема
- Служба находится в состоянии failed или inactive
- Запуск службы возвращает ошибку
- Служба запускается и сразу падает
- Приложение на порту не отвечает
- В журналах появляются сообщения об ошибке
Частые причины
Ошибка в конфигурации службы
Неправильный unit-файл, неверный путь к исполняемому файлу или отсутствующие параметры препятствуют запуску.
Отсутствующие разрешения или владелец
У службы может не быть прав на чтение конфигурации, запись в каталог или доступ к сети.
Зависимость не выполнена
Служба зависит от другой службы, сети или монтирования диска, которые недоступны в момент запуска.
Порт занят
Другое приложение уже использует порт, который служба пытается занять.
Отсутствующие файлы или библиотеки
Исполняемый файл, конфигурационный файл или разделяемая библиотека не существуют в ожидаемом месте.
Пошаговое решение
- 1
Проверьте статус службы
Выполните
systemctl status имя-службы. Обратите внимание на состояние (failed, inactive) и последние сообщения об ошибке. Статус часто дает первую подсказку о причине. - 2
Просмотрите журналы
Используйте
journalctl -u имя-службы -xeдля подробных журналов. Опция-eпереходит к концу, а-xдает пояснения. Если служба недавно упала, добавьте--since "10 min ago". - 3
Проверьте unit-файл
Выполните
systemctl cat имя-службы, чтобы увидеть содержимое unit-файла. Убедитесь, что пути к исполняемому файлу и конфигурации верны и нет синтаксических ошибок. - 4
Протестируйте исполняемый файл вручную
Выполните команду из
ExecStartвручную от имени пользователя, указанного вUser=. Если вручную работает, проблема в окружении службы (переменные, разрешения). - 5
Проверьте разрешения и владельца
Убедитесь, что пользователь службы имеет права на чтение и запись в необходимые каталоги. Используйте
ls -lиnamei -lдля проверки пути. - 6
Проверьте зависимости
Выполните
systemctl list-dependencies имя-службы. Убедитесь, что все зависимости активны. Можно вручную запустить зависимую службу и повторить попытку. - 7
Проверьте, занят ли порт
Используйте
sudo ss -tulnp | grep :PORT, чтобы увидеть, какой процесс держит порт. Если он занят, проверьте, что это за процесс, и остановите его только если это безопасно, или измените порт в конфигурации. - 8
Перезагрузите systemd и запустите службу
После изменения unit-файла выполните
systemctl daemon-reload, затемsystemctl start имя-службы. Снова проверьте статус.
Если ничего не помогает
Если служба по-прежнему не запускается, проверьте, нет ли ограничения ресурсов (например, LimitNOFILE) или SELinux/AppArmor. Если вы тестируете SELinux, временно переведите его в режим permissive (setenforce 0) только на тестовой системе и сразу верните в режим enforcing (setenforce 1); не отключайте защиту навсегда на производственной системе. Посмотрите также системные журналы (journalctl -b) на предмет ошибок, не связанных напрямую со службой. Для сложных случаев запустите команду из ExecStart под strace -f, чтобы увидеть, где она останавливается.
Как избежать повторения
- Регулярно обновляйте systemd и службы
- Используйте `systemd-analyze verify` для проверки unit-файлов
- Настройте мониторинг ключевых служб
- Ведите учет изменений конфигурации
Когда лучше обратиться к специалисту
Если вы испробовали все шаги, а служба все еще не работает, или если у вас нет доступа к учетной записи root, обратитесь в ИТ-поддержку. Они смогут глубже проанализировать систему и безопасно применить продвинутые методы.
Обслуживание ИТ-инфраструктуры · Серверы, сети, резервное копирование, безопасность и helpdeskЧастые вопросы
Как посмотреть все журналы для службы?
Используйте `journalctl -u имя-службы` без опции `-e`, чтобы увидеть все записи. Можно добавить `-f`, чтобы следить за журналами в реальном времени.
Что означает ошибка "status=203/EXEC"?
Она указывает, что systemd не смог выполнить команду из `ExecStart`. Проверьте путь, разрешения и наличие файла.
Как изменить пользователя, от имени которого выполняется служба?
Измените `User=` в unit-файле (лучше через `systemctl edit имя-службы`), затем выполните `systemctl daemon-reload` и перезапустите службу.