Лабораторная: сбои systemd¶
В паре со статьёй: Устройство systemd
Окружение: одна одноразовая VM.
Начальные условия¶
- Создайте тестовый сервис, точно как в упражнении родительской статьи:
# /etc/systemd/system/labapp.service
[Unit]
Description=Lab Test Application
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/sleep infinity
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
- Убедитесь, что
systemctl status labappпоказываетactive (running).
Инструкции¶
Часть 1 — Сломайте намеренно¶
Внесите одну из следующих неисправностей:
- Цикл падений: измените
ExecStartна команду, которая падает немедленно и постоянно, например/bin/false, оставивRestart=on-failureи короткийRestartSec. Выполнитеdaemon-reloadи перезапустите юнит. - Сбой зависимости: добавьте
Requires=nonexistent.serviceв секцию[Unit](ссылка на несуществующий юнит),daemon-reload, затем попробуйте запустить. - Неверный пользователь: добавьте
User=nonexistentuserв[Service](учётная запись, которой не существует в этой системе),daemon-reload, перезапуск.
Часть 2 — Диагностируйте¶
Используя systemctl status labapp и journalctl -u labapp, определите:
- Считается ли юнит
failed, или он застрял в каком-то другом состоянии? - Какую конкретную ошибку показывает
journalctl, и указывает ли она прямо на реальную первопричину, или нужно о ней порассуждать?
Ожидаемые результаты¶
- Неисправность цикла падений:
systemctl statusпокажет быстрые попытки перезапуска; если число перезапусков превышаетStartLimitBurstпо умолчанию (5 за 10 секунд) в этом окне, systemd прекращает попытки, и юнит оказывается в состоянииfailedс сообщениемStart request repeated too quicklyв журнале — очень конкретное, легко находимое сообщение. - Неисправность сбоя зависимости:
systemctl start labappпадает немедленно с сообщением, что юнит-зависимость не найден;journalctlсошлётся на отсутствующий юнит напрямую по имени. - Неисправность неверного пользователя: сервис не запускается с кодом выхода вида
status=217/USER(или похожим), видимым прямо в выводеsystemctl status, без необходимости вообще копаться вjournalctlдля этого конкретного случая — сам код выхода и есть диагностика.
Чек-лист диагностики¶
- [ ] Проверили ли вы в
systemctl statusконкретныйstatus=<код>/<причина>последнего выхода, а не только надписьfailed? - [ ] Для неисправности цикла падений: распознали ли вы
StartLimitBurst/StartLimitIntervalSecкак механизм, который в итоге останавливает метания, а не бесконечный цикл? - [ ] Показал ли
journalctl -u labapp --since "5 min ago"достаточно истории, чтобы увидеть паттерн (быстрые повторные запуски), или понадобилось скорректировать--since, чтобы его захватить?
Критерии успеха¶
При любой из трёх неисправностей (не зная заранее, какая именно) вы можете назвать конкретную первопричину — не просто «он упал» — используя только systemctl status и journalctl -u labapp, в течение одной минуты.
Очистка / откат¶
sudo systemctl disable --now labapp.service
sudo rm /etc/systemd/system/labapp.service
sudo systemctl daemon-reload
sudo systemctl reset-failed labapp.service # сбросить запись о зависшем "failed"-состоянии
Убедитесь, что systemctl status labapp теперь сообщает Unit labapp.service could not be found, прежде чем считать окружение очищенным.