В операционной системе Linux, так же как и в Windows, кроме обычных программ, с которыми может взаимодействовать пользователь, есть еще один вид программ. Это работающие в фоне службы. Важность служб тяжело переоценить, они следят за состоянием системы, обеспечивают автоматическое подключение внешних устройств и сети, позволяют процессам взаимодействовать с оборудованием (dbus); также в виде служб реализованы различные веб-серверы и серверы баз данных.
Чтобы всем этим управлять, нужна основная служба — система инициализации, которая будет запускать службы Linux в нужный момент, следить, чтобы они нормально работали, записывать сообщения логов, и самое главное — предоставлять пользователям интерфейс для управления службами. Саму систему инициализации запускает ядро Linux.
Раньше для управления службами использовались скрипты. Тогда каждая служба запускалась в фоновом режиме одна за другой, без возможности параллельного запуска. Скрипт инициализации получал PID процесса для каждой службы, сохранял его, и потом с помощью него можно было проверить, работает ли служба и остановить службу Linux, если это нужно. Все это можно сделать и вручную.
Но потом на смену этому методу пришла новая модель и система инициализации Systemd. Эта система позволяет запускать службы параллельно, поэтому появилась необходимость настраивать зависимости между службами. Таким образом, теперь порядок запуска служб определяет сложное дерево зависимостей. После запуска Systemd собирает весь вывод службы в лог и следит за ее работой, и если служба аварийно завершилась, то автоматически перезапускает ее при необходимости.
Служба в Systemd описывается файлом юнита, в нем описано, каким образом эту службу надо запускать, а также как с ней себя вести. Существуют следующие типы юнитов:
service - обычная служба, программа
target - группа служб
automount - точка автоматического монтирования
device - файл устройства, генерируется на этапе загрузки
mount - точка монтирования
path - файл или папка
scope - внешний процесс
slice - группа системных служб systemd
snapshot - сохраненное состояние запущенных служб
socket - позволяет активировать службу по необходимости.
В Systemd есть специальный инструмент для управления службами в Linux — команда systemctl. Эта утилита позволяет делать очень много вещей, начиная от перезапуска службы Linux и проверки ее состояния, до анализа эффективности загрузки службы. Синтаксис у этой утилиты такой:
systemctl опции команда служба
Опции настраивают поведение программы, подробность вывода, команда — указывает, что нужно сделать со службой, а служба — это та самая служба, которой мы собираемся управлять. В некоторых случаях утилита может использоваться без указания команды и службы. Опции очень сильно зависят от команд.
start — запустить службу Linux
stop — остановить службу Linux
status — посмотреть состояние и вывод службы
reload — попросить службу перечитать свою конфигурацию из файловой системы
restart — перезапустить службу
try-restart — перезапустить службу, только если она запущена
reload-or-restart — попросить службу обновить свою конфигурацию, если не поддерживается просто выполнить перезапуск службы Linux
kill — отправить сигнал завершения процессу; используется вместе с опциями --signal и --kill-who
clean — удалить все данные, которые касаются указанной службы, сюда входит кэш, логи, данные выполнения
show — посмотреть параметры управления службой в Linux
cat — посмотреть содержимое юнит-файла в текстовом виде
enable — добавить службу в автозагрузку
disable — удалить службу из автозагрузки
reenable — сначала выполнить disable, потом enable для службы
list-jobs — вывести все выполняющиеся задачи Systemd
snapshot — сохранить состояние служб, чтобы потом восстановить
daemon-reload — обновить конфигурацию юнитов для всех служб
mask — сделать юнит недоступным
unmask — вернуть файл службы Linux
link — добавить юнит-файл, который расположен не в стандартной папке для юнитов
revert — вернуть юнит до состояния по умолчанию
edit — редактировать параметры службы, не изменяя основной файл юнита.
Вывод всех юнитов:
systemctl
Вывод всех служб:
systemctl --type=service
Просмотр состояния службы:
systemctl status mysql
Добавить в автозагрузку и сразу запустить:
systemctl enable --now nginx
Открыть юнит файл демона на редактирование:
systemctl edit --full postgresql