Ответ вслух Senior systemd и журналы обновлено

Сервис не стартует

Вопрос

После деплоя systemctl start api возвращает ошибку, сервис в состоянии failed. Как будешь разбираться?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Первое: systemctl status api. Там видно, с каким кодом или сигналом процесс вышел, и последние строки журнала.

Что должно прозвучать в ответе

  • `systemctl status api`: код выхода, сигнал, последние строки лога

  • `journalctl -u api -b -n 100` или `-e`: полная ошибка приложения

  • Проверить сам юнит: `systemctl cat api`, опечатки, пути в ExecStart, права пользователя

  • Запустить команду ExecStart вручную от того же пользователя с тем же окружением

  • Типичные причины: порт занят (`ss -tlnp`), нет файла конфига или прав, не установлены зависимости

  • После правки `daemon-reload`, при `start-limit-hit` `reset-failed`

Что могут спросить следом

  • Как узнать, кто занял порт?
  • Что значит status=203/EXEC?
  • Как увидеть итоговый юнит со всеми override?

Разбор

Первое: systemctl status api. Там видно, с каким кодом или сигналом процесс вышел, и последние строки журнала. Если мало, journalctl -u api -b -n 100 --no-pager: обычно там исключение приложения. Если ошибка systemd вроде 203/EXEC, значит не удалось запустить сам бинарник: неверный путь, нет права x, неверный shebang. Смотрю итоговый юнит с override через systemctl cat api. Дальше запускаю ExecStart руками от того же пользователя: sudo -u api env $(cat /etc/api/env) /usr/bin/node server.js. Частые причины: порт уже занят (проверка ss -tlnp | grep 8080), нет прав на каталог или файл конфига, не хватает переменной окружения, база ещё не поднялась. После исправления юнита daemon-reload, а если упёрлись в лимит запусков, systemctl reset-failed api и снова start.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.