Управление службами и системными журналами

LinuxBeginner
Практиковаться сейчас

Введение

Процесс — это запущенная программа. Служба — это системная функция, которая работает длительное время и управляется в соответствии с определением и правилами жизненного цикла. В 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, использовали состояние и логи вместе для объяснения управляемой неисправности и восстановили службу. Такой порядок работы — сначала состояние, затем логи — служит практической основой для устранения неполадок служб на начальном уровне.