Бесплатная миграция IT-инфраструктуры в облако

Как использовать Systemctl для управления службами Systemd

Никита Кулижников
Никита Кулижников
Технический писатель
19 апреля 2022 г.
13863
13 минут чтения
Средний рейтинг статьи: 5

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

Как Использовать Systemctl Для Управления Службами Systemd (1)

Кроме быстродействия и возможности взаимодействовать с процессами напрямую, systemd также предоставляет информацию о сервисах, которую собирает из разных источников. Это достигается благодаря встроенной системе журналирования journald. Всю диагностическую информацию о работе сервиса вы можете увидеть благодаря journald — сообщения ядра, системные сообщения syslog, STDOUT и STDERR агрегируются в одном месте для того, чтобы пользователь мог быстро просмотреть информацию.

В этой статье мы рассмотрим управление системой инициализации systemd c помощью команды systemctl. Разберемся в том, как запускать и останавливать службы, проверять статус и работать с конфигурационными файлами.

Установка

Менеджер systemd заменил традиционную подсистему init в 2010-х годах и с тех пор стал системой инициализации по умолчанию во многих дистрибутивах Linux. Во всех linux-дистрибутивах, которые вы закажете на timeweb.cloud, systemd предустановлен.

Но в некоторых ОС при использовании команды systemctl вы всё ещё можете встретить ошибку systemctl is not installed. Это значит, что на вашей машине установлена другая система инициализации. Но сменить её на systemd несложно. Первое, что нужно сделать — установить пакет systemd:

sudo apt-get install systemd

Затем в настройках ядра Linux нужно прописать использование systemd. Для этого откроем файл с настройками загрузчика GRUB:

sudo nano /etc/default/grub

и добавим в настройку GRUB_CMDLINE_LINUX_DEFAULT опцию init=/lib/systemd/systemd.

Чтобы применить изменения нужно сгенерировать новый файл конфигурации grub и перезапустить систему: 

sudo update-grub
sudo shutdown -r now

Модули systemd

При управлении процессами менеджер systemd оперирует так называемыми модулями или юнитами. По сути, юнит — текстовое описание сервиса, в котором перечислены операции для выполнения до и после запуска службы.

Все модули можно найти в трёх каталогах:

  • /usr/lib/systemd/system — юниты сервисов, установленных с помощью менеджера пакетов. Самый простой пример — веб-серверы: Apache или Nginx.
  • /run/systemd/system — юниты, которые создаются в процессе работы системы.
  • /etc/systemd/system — юниты, которые создаёт администратор системы.

Список всех запущенных модулей можно посмотреть, использовуя команду systemctl. В терминале вы увидите таблицу со статусом каждой службы. Разберём, что означает каждый из столбцов:

  1. UNIT. Название модуля
  2. LOAD. Статус загрузки конфигурации, если успешно — loaded.
  3. ACTIVE. Статус службы. Один из следующих: active, inactive, running, exited, dead, loaded, not-found, plugged, mounted, waiting, listening.
  4. SUB. Детальная информация о юните.
  5. DESCRIPTION. Краткое описание модуля — за что он отвечает.

Image3

Чтобы увидеть все модули, независимо от того, запущены они или нет, воспользуйтесь командой systemctl list-units --all. Вы увидите все модули, которые когда-либо загружал или пытался загрузить диспетчер systemd. Для отображения конкретных записей используйте флаг --state. Так, например, для того, чтобы увидеть все неактивные юниты, нужно использовать:

sudo systemctl list-units --all --state=inactive

Типы юнитов

Модули делятся на категории по типу. Тип каждого модуля можно узнать из названия файла — он указан через точку. Все типы модулей:

  1. .service — описывает, как управлять службой и приложением
  2. .socket — описывает сетевой буфер, который используется для активации сокета
  3. .device — описывает устройство как необходимое для управления systemd
  4. .mount — определяет точку монтирования в системе
  5. .automount — настраивает автоматическую установку точки монтирования
  6. .swap — описывает пространство подкачки в системе
  7. .target — обеспечивает синхронизацию устройств при загрузке системы
  8. .path — определяет путь, который используется для активации
  9. .timer — определяет задержку или активацию по плану
  10. .snapshot — делает снимок системы для последующего восстановления
  11. .slice — ограничивает узлы группы управления
  12. .scope — systemd создаёт эти модули автоматически, пользуясь информацией из интерфейса шины
vds

Структура юнита

Каждый модуль представляет собой текстовый файл, который разделён на обязательные секции и переменные. Разберём на примере модуля sshd:

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target

[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

Unit

Это первая обязательная секция. В ней описаны правила взаимодействия с другими службами и указаны метаданные — описание и документация. Подробнее:

  • Description — описание модуля.
  • Documentation — страница руководства man.
  • After — после каких демонов и событий нужно запускать модуль. Например, модули веб-серверов запускаются только после сетевых интерфейсов.
  • Requires — сервисы, необходимые для работы юнита
  • Wants — сервисы, которые желательно запустить перед стартом модуля

Service

В этой секции необходимо указать, какими командами запускать службу:

  • Type — как запускается демон? По умолчанию — simple, то есть служба просто запускается. Notify это примерно то же самое, но в таком случае процесс сообщит диспетчеру, что он готов к работе. Есть также типы forking (после запуска демона родительский процесс завершается) и one-shot (выполняется один раз).
  • PIDFile — ссылка на основной процесс
  • WorkingDirectory — текущая рабочая директория для запуска команд
  • User — пользователь для запуска сервиса
  • Group — группа для запуска сервиса
  • ExecStart — команда для запуска сервиса
  • ExecStop — команда для остановки сервиса
  • TimeoutSec — время, которое служба ожидает остановки или старта
  • Restart — настройки перезапуска

Install

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

Список доступных целей вы можете получить, выполнив команду 

sudo systemctl list-unit-files --type=target

Редактирование модулей

Модули нельзя править напрямую. Для этого нужно использовать команду systemctl edit. Откроется файл, который можно использовать для переопределения директив службы или добавления новых. При этом настройки из файла переопределения приоритетнее, чем настройки по умолчанию. 

Если нужно отредактировать файл модуля целиком, а не добавлять новые директивы, нужно использовать флаг --full:

sudo systemctl edit --full apache2.service

Перед вами откроется редактор, в котором вы можете править настройки юнита. 

По умолчанию файлы переопределения хранятся в /etc/systemd/system/, в каталоге который называется так же, как модуль, но с суффиксом .d. Например, в случае apache2 это будет директория /etc/systemd/system/apache2.service.d/

Если вы редактируете конфигурацию напрямую с использованием флага --full, нужный файл находится в каталоге /etc/systemd/system/ и называется так же, как модуль.

Для того, чтобы удалить переопределения, которые вы добавили, просто удалите каталог с суффиксом .d. Если нужно восстановить настройки по умолчанию, удалите весь файл модуля. В случае с apache2 это:

sudo rm -r /etc/systemd/system/apache2.service.d

или 

sudo rm /etc/systemd/system/apache2.service

После этого нужно перезагрузить процесс systemd:

sudo systemctl daemon-reload

Создание модуля

Вы также можете создать собственный модуль systemd. Это нужно когда вы, например, написали какой-то скрипт и хотите работать с ним с помощью системного менеджера и добавить в автозагрузку. 

Разберёмся на примере нашего вымышленного нового модуля, который проверяет состояние виртуальных серверов, заказанных на timeweb.cloud, — tmwb.service.

Сначала создадим юнит:

sudo nano /etc/systemd/system/tmwb.service

В описании укажем следующие строки:

[Unit] 
Description=Timeweb uptime checker
[Service]
Type=simple
ExecStart=/bin/bash /var/sc/check-uptime.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

Теперь нужно применить изменения и запустить службу

sudo systemctl daemon-reload
sudo systemctl start tmwb.service

Проверим статус и убедимся, что всё работает корректно:

sudo systemctl status tmwb.service

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

В этой статье нас интересуют только модули, которые имеют суффикс .service, то есть службы. 

Благодаря утилите systemctl список сервисов легко получить:

systemctl list-units --type=service

Для работы с большинством служб мы можем не использовать суффикс .service, потому что диспетчер systemd сам понимает, что вы хотите работать именно со службой, когда не указываете специфический юнит.

Запуск и остановка служб

Чтобы запустить службу используйте команду start. Например, для запуска apache2 выполним:

sudo systemctl start apache2.sevice

или 

sudo systemctl start apache2

Для установки службы нужно использовать команду stop. На примере apache2:

sudo systemctl stop apache2.service

Перезапуск и перезагрузка

Для того, чтобы перезапустить службу, используйте команду restart. Например, мы внесли изменения в конфигурацию веб-сервера и теперь нам нужно перезапустить apache2, нужно выполнить:

sudo systemctl restart apache2.service

Некоторые приложения поддерживают перезагрузку файлов конфигурации без перезапуска всей службы. В таком случае вы можете использовать команду reload. Например, если вы работаете c nginx в качестве веб-сервера, после изменения конфигурационных файлов можно выполнить reload:

sudo systemctl reload nginx.service

Но если вы не уверены, умеет ли служба перезагружать конфигурацию, воспользуйтесь командой reload-or-restart. В таком случае systemd перезагрузит конфигурацию или всю службу:

sudo systemctl reload-or-restart apache2.service

Включение и отключение

Основное предназначение диспетчера systemd — запускать службы при загрузке системы. Но все команды, перечисленные выше, относились к работе только во время текущего сеанса. 

Чтобы включить автозагрузку приложения, воспользуйтесь командой enable. После этого systemd создаст символическую ссылку из служебного файла — /etc/systemd/system — в место, где диспетчер ищет приложения для автозапуска.

sudo systemctl enable apache2.service 

Чтобы отключить автозапуск, используйте disable. При этом символическая ссылка будет удалена.

sudo systemctl disable apache2.service

Обратите внимание, что ни включение, ни отключение автозагрузки приложения не повлияют на работу службы в текущем сеансе.

Проверка статуса

Чтобы проверить статус службы в системе, нужно использовать команду status

Например, команда sudo systemctl status apache2.service отобразит статус, процессы в иерархии контрольных групп и фрагмент журнала.

Image1

Этого достаточно для того, чтобы проверить, корректно ли работает служба и устранить проблемы, если они возникают. 

Помимо развёрнутого отчёта о статусе службы диспетчер systemd также предоставляет методы для проверки конкретных статусов. Это позволяет обернуть множество проверок в скрипты и проще работать с результатом.

  • is-active. Проверяет, активен ли модуль. Возвращает active или inactive.
  • is-enabled. Проверяет, включена ли автозагрузка службы. Возвращает enabled или disabled.
  • is-failed. Проверяет, находится ли юнит в работе. Возвращает active, если всё работает корректно, failed — если ошибка. При этом вы можете получить также unknown или inactive, если служба была остановлена вручную.

Управление модулями

С помощью команды systemctl мы также можем получить более конкретную информацию о юнитах systemd. Чтобы прочитать файл модуля, нужно использовать команду cat. Проверим, на примере службы sshd:

sudo systemctl cat sshd.service

В результате увидим файл модуля, с которым работает systemd. 

Зависимости

Один модуль может вызывать работу других, поэтому важно контролировать эти зависимости. Systemctl предоставляет удобный иерархический вид для просмотра зависимостей модуля.

Image4

Вы также можете проверить все модули, которые зависят от указанного юнита, с помощью флага --reverse

Свойства

Для того, чтобы просмотреть свойства на более низком уровне, чем это предоставляет cat, нужно выполнить команду show. Список свойств юнита будет выведен в формате ключ — значение.

sudo systemctl show apache2.service

Image2

Если нужно показать только одно свойство, передайте его название с флагом -p. Команда sudo systemctl show apache2.service -p Description отобразит сообщение Description=The Apache HTTP Server.

Маскировка модулей

Помимо простого отключения автозагрузки приложения systemd позволяет полностью удалить возможность включать модуль — это называется маскировкой юнита. Её можно выполнить с помощью команды:

sudo systemctl mask apache2.service

После этого при попытке запустить службу вы увидите сообщение об ошибке: Failed to start apache2.service: Unit apache2.service is masked.

Чтобы снять маскировку и снова сделать модуль доступным для включения, воспользуйтесь командой unmask:

sudo systemctl unmask apache2.service

Настройка системы с помощью целей

Цели — специальные файлы модулей, которые описывают состояние системы. Они определяются по суффиксу .target. В основном эти файлы используются для группировки других юнитов. Например, в системе существует цель swap.target, которая указывает, что файл подкачки готов к использованию. Модули, которым нужен этот файл могут указывать его в своей спецификации. 

Диспетчер systemd позволяет изолировать цели — то есть запустить все юниты, связанные с этой целью, и остановить все остальные. Чтобы случайно не остановить важные для системы процессы, сначала посмотрите на зависимости цели, которую изолируете, с помощью команды list-dependencies:

sudo systemctl list-dependencies multi-user.target

Если все перечисленные модули можно завершить, цель можно изолировать:

sudo systemctl isolate multi-user.target

Существуют цели, которые используются для важных событий, например, перезагрузки системы. Для того, чтобы пользователю было проще оперировать этими событиями, созданы ярлыки systemctl:

  1. systemctl rescue вводит систему в режим восстановления;
  2. systemctl halt осуществляет изоляцию цели halt.target
  3. systemctl poweroff готовит систему к завершению работы (то же самое, что команда poweroff)
  4. systemctl reboot перезапускает систему (в точности то же самое, что команда reboot)
Выгодные тарифы на VDS/VPS в Timeweb Cloud

Заключение

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

Знание основ работы с диспетчером systemd значительно упрощает взаимодействие с системой Linux и позволяет гибко конфигурировать службы.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
19 апреля 2022 г.
13863
13 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев