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

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

Введение

Процесс — это запущенная программа. Служба — это системная функция длительного выполнения, управляемая в соответствии с определением и правилами жизненного цикла. В Ubuntu systemd читает определения юнитов, запускает и останавливает службы, отслеживает их состояния и записывает их вывод в системный журнал.

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