Введение
Процесс — это запущенная программа. Служба — это системная функция, которая работает длительное время и управляется в соответствии с определением и правилами жизненного цикла. В Ubuntu systemd читает определения юнитов, запускает и останавливает службы, отслеживает их состояния и записывает их вывод в системный журнал.
В этой лабораторной работе вы будете использовать изолированную учебную службу labex-heartbeat. Вы изучите её юнит, измените состояние службы во время работы, настроите запуск при загрузке, запросите данные из журнала и традиционных текстовых логов, проследите за выводом в реальном времени, диагностируете управляемую неисправность и восстановите нормальную работу. Вы не будете редактировать файлы юнитов или изменять службу SSH.
Распознавание systemd и юнитов служб
На этом шаге вы убедитесь, что systemd доступен, и различите запущенные юниты и установленные файлы юнитов.
Перейдите в рабочий каталог лабораторной работы:
cd /home/labex/project/service-lab
Выведите версию systemd. Для идентификации достаточно первой строки:
systemctl --version | head -n 1
Запросите общее состояние systemd:
systemctl is-system-running || true
Состояние running означает, что все необходимые юниты работают нормально. Учебная виртуальная машина может сообщить degraded, если произошёл сбой в другой необязательной службе; эта команда всё равно подтверждает, что systemd отвечает.
Выведите часть списка запущенных служб:
systemctl list-units --type=service --state=running --no-pager | head -n 12
Юнит — это объект, которым управляет systemd. Имена юнитов служб заканчиваются на .service. Файлы юнитов описывают объекты, которыми можно управлять, даже если они сейчас не запущены:
systemctl list-unit-files --type=service --no-pager | head -n 12
Сохраните краткую сводку systemd. Подстановка команд $(...) вставляет вывод команды в текст, который записывает printf:
printf 'systemd=%s\nstate=%s\n' "$(systemctl --version | head -n 1)" "$(systemctl is-system-running)" > systemd-summary.txt
cat systemd-summary.txt
Просмотр определения и состояния службы
На этом шаге вы изучите подготовленную учебную службу перед её запуском.
systemctl status объединяет путь к загруженному юниту, состояние включения, текущее состояние службы, сведения о процессе и последние строки журнала:
cd /home/labex/project/service-lab
systemctl status labex-heartbeat.service --no-pager
Служба должна иметь состояние inactive (dead) и быть disabled. inactive означает, что служба сейчас не работает; disabled означает, что она не настроена на запуск через целевой юнит установки при загрузке. Это независимые свойства.
Выведите определение юнита:
systemctl cat labex-heartbeat.service
Секция [Unit] описывает идентификатор и порядок запуска, [Service] определяет процесс, а [Install] описывает включение службы. Вы только просматриваете подготовленный юнит и не должны создавать его вручную.
Используйте systemctl show для просмотра свойств в формате, удобном для обработки программами:
systemctl show labex-heartbeat.service -p LoadState -p ActiveState -p SubState -p UnitFileState
Сохраните эти свойства для проверки:
systemctl show labex-heartbeat.service -p LoadState -p ActiveState -p SubState -p UnitFileState > service-properties.txt
cat service-properties.txt
Запуск, остановка и перезапуск службы
На этом шаге вы измените состояние учебной службы во время работы и проверите каждый результат.
Для запуска и остановки системных служб нужны повышенные привилегии. Запустите службу:
sudo systemctl start labex-heartbeat.service
Проверьте её краткое активное состояние:
systemctl is-active labex-heartbeat.service
Ожидаемый вывод — active. Просмотрите подробное состояние:
systemctl status labex-heartbeat.service --no-pager
Теперь в состоянии службы должен отображаться основной PID. Остановите службу и проверьте результат:
sudo systemctl stop labex-heartbeat.service
systemctl is-active labex-heartbeat.service || true
Ожидаемое состояние — inactive. Снова запустите службу, а затем используйте restart, чтобы одной операцией заменить работающий процесс:
sudo systemctl start labex-heartbeat.service
sudo systemctl restart labex-heartbeat.service
systemctl show labex-heartbeat.service -p ActiveState -p SubState -p MainPID
В конце этого шага служба должна иметь ActiveState=active и SubState=running.
Настройка запуска при загрузке
На этом шаге вы различите текущее состояние службы во время работы и её включение для будущих загрузок системы.
После предыдущего шага служба активна, но при подготовке её файл юнита оставили отключённым. Проверьте состояние включения:
systemctl is-enabled labex-heartbeat.service || true
Включите службу:
sudo systemctl enable labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service
Включение создаёт ссылки, которые связывают службу с целевым юнитом загрузки. Уже работающую службу перезапускать не требуется.
Попрактикуйтесь в удалении этих ссылок загрузки:
sudo systemctl disable labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service || true
Служба может оставаться активной, даже если теперь вывод показывает disabled. Снова включите её, чтобы оставить лабораторную среду в итоговом состоянии:
sudo systemctl enable labex-heartbeat.service
Проверьте оба независимых свойства:
systemctl is-active labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service
Запрос логов службы с помощью journalctl
На этом шаге вы прочитаете последние сообщения службы из журнала systemd и сохраните отдельный снимок.
Службы, которыми управляет systemd, обычно отправляют стандартный вывод и стандартный поток ошибок в журнал. Запросите данные только для учебного юнита:
sudo journalctl -u labex-heartbeat.service -n 10 --no-pager
Параметр -u выбирает юнит, -n 10 оставляет десять самых последних записей, а --no-pager выводит их напрямую. Вы должны увидеть последние сообщения heartbeat. Сообщение о запуске могло уже выйти за пределы этого ограниченного списка, пока служба продолжала работать.
Ограничьте результаты недавним интервалом времени:
sudo journalctl -u labex-heartbeat.service --since "5 minutes ago" --no-pager
Отфильтруйте записи с приоритетом warning и выше. Отсутствие вывода — нормальный и допустимый результат, если служба не записывала предупреждений:
sudo journalctl -u labex-heartbeat.service -p warning --since "5 minutes ago" --no-pager
Сохраните последние записи только этого юнита в рабочем каталоге проекта:
cd /home/labex/project/service-lab
sudo journalctl -u labex-heartbeat.service -n 20 --no-pager > service-journal.txt
tail -n 5 service-journal.txt
Отслеживание традиционного текстового лога
На этом шаге вы изучите каталог /var/log и проследите за текстовым логом по мере появления новых записей.
В иерархии /var/log хранятся многие традиционные системные логи и логи приложений. Выведите небольшую часть списка:
ls -lh /var/log | head -n 12
Прочитайте последние записи учебной службы:
tail -n 5 /var/log/labex-heartbeat.log
Параметр -f отслеживает файл и выводит новые строки, когда другой процесс добавляет их в этот файл:
tail -f /var/log/labex-heartbeat.log
Дождитесь появления как минимум двух новых строк heartbeat, затем нажмите Ctrl+C. Это прерывает работу tail, но не останавливает службу, которая записывает лог.
Отфильтруйте строки heartbeat и выведите три самые последние:
grep '^heartbeat ' /var/log/labex-heartbeat.log | tail -n 3
Сохраните пять строк в рабочем каталоге проекта:
cd /home/labex/project/service-lab
tail -n 5 /var/log/labex-heartbeat.log > traditional-log-sample.txt
cat traditional-log-sample.txt
Диагностика и восстановление неисправной службы
На этом шаге вы создадите управляемую ошибку конфигурации, определите её с помощью состояния службы и логов, а затем восстановите нормальную работу.
Остановите учебную службу и создайте резервную копию её простой конфигурации:
sudo systemctl stop labex-heartbeat.service
sudo cp /etc/labex-heartbeat.conf /etc/labex-heartbeat.conf.bak
Замените числовой интервал недопустимым значением. Это намеренно нарушает работу только учебной службы:
sudo sed -i 's/^INTERVAL=2$/INTERVAL=invalid/' /etc/labex-heartbeat.conf
Попробуйте запустить службу. Ожидается сообщение об ошибке:
sudo systemctl start labex-heartbeat.service || true
Проверьте состояние неисправности:
systemctl status labex-heartbeat.service --no-pager || true
systemctl is-failed labex-heartbeat.service
Состояние показывает, что процесс завершился, но причина, связанная с приложением, указана в журнале:
sudo journalctl -u labex-heartbeat.service -n 10 --no-pager
Найдите сообщение configuration error: INTERVAL must be a positive integer. Восстановите заведомо исправную конфигурацию, очистите записанное состояние ошибки и снова запустите службу:
sudo mv /etc/labex-heartbeat.conf.bak /etc/labex-heartbeat.conf
sudo systemctl reset-failed labex-heartbeat.service
sudo systemctl start labex-heartbeat.service
Проверьте восстановление:
systemctl is-active labex-heartbeat.service
cat /etc/labex-heartbeat.conf
Служба должна иметь состояние active, а конфигурация снова должна содержать INTERVAL=2.
Итоги
Вы научились различать процессы, службы, активное состояние и включение при загрузке. Вы изучили юнит systemd, управляли безопасной учебной службой с помощью systemctl и запрашивали её записи с помощью journalctl.
Кроме того, вы изучили /var/log, отслеживали текстовый вывод в реальном времени с помощью tail -f, использовали состояние и логи вместе для объяснения управляемой неисправности и восстановили службу. Такой порядок работы — сначала состояние, затем логи — служит практической основой для устранения неполадок служб на начальном уровне.



