Systemd: управление сервисами

Основы управления юнитами

Базовыми компонентами, которыми управляет systemd, являются юниты (unit). Существует множество типов юнитов; самым распространённым типом является сервис (файлы с расширением .service). основным инструментом для управления сервисами является команда systemctl.

Команда systemctl имеет свой эквивалент для каждой стандартной команды системы инициализации. В качестве примера рассмотрим файл nginx.service.

Примечание: Чтобы получить этот файл, установите Nginx.

Чтобы запустить сервис, введите:

sudo systemctl start nginx.service

Чтобы остановить сервис:

sudo systemctl stop nginx.service

Перезапустить сервис можно так:

sudo systemctl restart nginx.service

Чтобы выполнить перезагрузку, не прерывая работы, введите:

sudo systemctl reload nginx.service

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

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

Чтобы настроить автозапуск сервиса, введите:

sudo systemctl enable nginx.service

Чтобы отключить сервис:

sudo systemctl disable nginx.service

Состояние системы

Сервер systemd может предоставить информацию, на основе которой можно сделать вывод о текущем состоянии системы.

К примеру, чтобы получить список всех активных юнит-файлов systemd, введите:

systemctl list-units

Чтобы просмотреть список всех юнитов, которые система systemd загрузила или попыталась загрузить в память (включая неактивные юниты), введите:

systemctl list-units --all

Чтобы вывести на экран список всех установленных юнитов (включая те, которые система systemd не загрузила в память), наберите:

systemctl list-unit-files

 Просмотр логов

Компонент systemd под названием journald собирает и управляет общесистемными записями в журнале – то есть данными логов приложений и ядра.

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

journalctl

По умолчанию эта команда выведет записи текущей и предыдущих загрузок (если инструмент journald настроен для сохранения записей от предыдущих загрузок). Некоторые дистрибутивы включают это поведение по умолчанию, а некоторые – нет. Чтобы включить сохранение записей от предыдущих загрузок, можно:

  1. Отредактировать файл /etc/systemd/journald.conf. Измените значение параметра Storage=, указав persistent.
  2. Создать постоянный каталог при помощи команды:

sudo mkdir -p /var/log/journal

Чтобы просмотреть только записи текущей загрузки, введите:

journalctl -b

Записи ядра (которые, как правило, представлены как dmesg) можно просмотреть при помощи команды:

journalctl -k

Если совместить флаги -k и –b, можно получить записи ядра только для текущей загрузки.

journalctl -k -b

Состояние юнитов

Приведенные выше команды дают доступ к информации об общем состоянии системы. Также команда systemctl позволяет получить данные о состоянии отдельных юнитов.

Чтобы узнать текущее состояние юнита, используйте опцию status. Команда вернёт состояние юнита (включен или отключен), сведения о процессе и последние записи в журнале:

systemctl status nginx.service

Чтобы просмотреть все записи в журнале, сделанные определённым юнитом, используйте флаг –u и команду journalctl:

journalctl -u nginx.service

Как и ранее, ограничить вывод текущей загрузкой можно с помощью флага –b:

journalctl -b -u nginx.service

Проверка юнитов и юнит-файлов

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

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

systemctl cat nginx.service

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

systemctl list-dependencies nginx.service

Эта команда покажет список зависимых юнитов и юниты target (целевые). Чтобы получить расширенный список зависимостей, введите:

systemctl list-dependencies --all nginx.service

Чтобы просмотреть детали настроек юнита, используйте следующую опцию:

systemctl show nginx.service

Эта команда вернёт значения всех параметров, которыми управляет systemd.

Изменение юнит-файлов

Система systemd позволяет изменять юнит-файлы с помощью команды systemctl.

Чтобы добавить сниппет юнит-файла, который в дальнейшем можно использовать для расширения или переопределения параметров стандартных юнит-файлов, используйте опцию edit:

sudo systemctl edit nginx.service

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

sudo systemctl edit --full nginx.service

Отредактировав юнит-файл, перезапустите процесс systemd, чтобы изменения вступили в силу:

sudo systemctl daemon-reload

Уровни выполнения

Ещё одной важной функцией системы инициализации является переход самого сервера между различными состояниями. В традиционных системах инициализации это обычно называется уровнями выполнения;  система может одновременно находиться только на одном уровне выполнения.

В системе systemd концепция уровней выполнения заменена так называемыми целями (targets). Цели – это точки синхронизации, при помощи которых сервер может переключать состояния. Сервисы и другие юнит-файлы можно привязывать к целям. Кроме того, система может использовать несколько целей однвременно.

Чтобы просмотреть доступные цели, введите:

systemctl list-unit-files --type=target

Чтобы просмотреть цель по умолчанию, которую система systemd использует сразу после запуска (она в свою очередь запускает все юнит-файлы, которые являются частью её дерева зависимостей), введите:

systemctl get-default

Чтобы изменить цель по умолчанию, используйте опцию set-default:

sudo systemctl set-default multi-user.target

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

systemctl list-dependencies multi-user.target

С помощью опции isolate можно переключать цели. Однако прежде чем переключить цель, убедитесь, что новая цель не отключит важнейшие сервисы.

sudo systemctl isolate multi-user.target

Остановка и перезапуск сервера

Также система инициализации может использовать сокращённые команды. К примеру, чтобы отключить сервер, введите:

sudo systemctl poweroff

Если вы хотите перезапустить сервер, введите:

sudo systemctl reboot

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

sudo systemctl rescue

Большинство операционных систем может использовать традиционные алиасы для наиболее распространённых операций. То есть, вы можете опустить команду systemctl и ввести просто:

sudo poweroff
sudo reboot

Однако имейте в виду: эта функция поддерживается не всегда.