Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

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

23295
13 минут чтения
Средний рейтинг статьи: 2.7

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:

    

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

    

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

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

    

Модули 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. Так, например, для того, чтобы увидеть все неактивные юниты, нужно использовать:

    

Типы юнитов

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

  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 и VPS

Гибкие виртуальные серверы с почасовым
биллингом по всему миру: Россия, Азия и Европа.

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

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

    

Unit

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

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

Service

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

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

Install

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

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

    

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

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

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

    

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

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

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

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

    

или 

    

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

    

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

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

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

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

    

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

    

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

    

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

    

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

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

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

    

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

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

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

    

или 

    

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

    

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

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

    

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

    

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

    

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

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

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

    

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

    

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

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

Чтобы проверить статус службы в системе, нужно использовать команду 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:

    

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

Зависимости

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

Image4

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

Свойства

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

    

Image2

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

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

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

    

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

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

    

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

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

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

    

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

    

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

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

Выгодные тарифы на VDS/VPS в Timeweb Cloud

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

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

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

23295
13 минут чтения
Средний рейтинг статьи: 2.7

Читайте также

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server