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



