Используйте силу, о которой вы даже не подозревали

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

Что такое systemd?

systemd - это набор компьютерных программ, предназначенных для управления и соединения различных частей системы. Он разработан как замена сценариям запуска в стиле SystemV и LSB, которые были распространены с 1980-х годов. systemd состоит из следующих компонентов:

  • systemd— системный и сервисный менеджер
  • systemctl - инструмент командной строки для взаимодействия с systemd
  • journald - единый фреймворк логирования
  • logind - демон, который обрабатывает логины и рабочие места пользователей.
  • resolved, timesyncd и networkd - отвечают за сетевое соединение, разрешение доменного имени и синхронизацию времени с интернет-ресурсами.

Это очень общий обзор архитектуры systemd, но пока он нам подойдет.

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

Служба - это, по сути, процесс, работающий в фоновом режиме и управляемый / предоставляемый systemd. В число служб, которые вы хотели бы запускать в качестве служб, входят различные серверы (HTTP, SSH, FTP), утилиты синхронизации (Syncthing, rsync), гипервизоры виртуализации (Docker, K8s) и многое другое. Начнем с перечисления всех доступных служб в вашей системе, выполнив эту команду:

$ systemctl

Вам будет представлена ​​таблица, которая выглядит так:

По умолчанию эта команда перечисляет устройства, точки монтирования, пространства имен и службы, что нас и интересует. Прокрутите вниз, чтобы увидеть раздел службы (вы заметите, что все имеет расширение .service):

Вот структура этой таблицы:

  • Имя службы (соответствует имени файла конфигурации .service).
  • Текущий статус услуги. loaded означает, что systemd знает об этом, а active означает, что systemd запустил его успешно.
  • Текущее состояние процесса. Он указывает, является ли процесс running или exited. Обратите внимание, что служба active может быть exited. Например, при загрузке должно произойти одно действие, а затем процесс возвращается. Услуга до сих пор считается active.
  • Описание

Если вы хотите увидеть более подробную информацию о конкретной службе, используйте эту команду:

$ systemctl status SERVICE_NAME

Например, запуск systemctl status dbus в моей системе приведет к следующему:

Эта команда сообщит вам больше информации, чем предыдущая: например, время работы, путь к .service файлу, имя процесса и его PID. Хотя это полезно, status обычно используется для устранения неполадок службы. Например, у меня проблема с сервисом syncthing-discosrv. Выполнение той же команды на нем скажет мне следующее:

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

Наконец, самые интересные команды ... Для запуска / остановки сервисов используйте:

$ systemctl start/stop SERVICE_NAME

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

$ systemctl enable/disable SERVICE_NAME

Теперь самое интересное.

Создание собственных сервисов

systemd не будет очень полезен, если не позволит вам создавать свои собственные службы. К счастью, это довольно просто сделать. Начнем с самого простого примера: запуск сценария bash при загрузке. Предположим, у вас есть сценарий, расположенный в /usr/bin/runme.sh, который выполняет какую-то очистку. Теперь, чтобы запустить его при загрузке, вам нужно создать unit файл.

Создайте его в /etc/systemd/system/runme.service:

[Unit] 
Description=Cleaning service 
[Service] 
Type=simple ExecStart=/bin/bash /usr/bin/runme.sh 
[Install] 
WantedBy=multi-user.target

Это должно быть довольно просто. Description устанавливает описание (как было показано ранее в статье). Type устанавливает тип нашей службы, который также может быть forking, если служба порождает несколько процессов. ExecStart - это фактическая команда, используемая для запуска службы. Наконец, WantedBy указывает, когда эта служба должна запускаться. multi-user означает регулярный запуск системы, чего вы хотите в большинстве случаев. Обратите внимание, что если вы запустите однопользовательский режим (восстановление), эта служба не запустится (что может быть, а может и не быть тем, что вам нужно). Теперь, чтобы включить эту службу:

$ systemctl enable runme 
$ systemctl status runme 
// .... ENABLED .....

Если хотите, можете запустить его один раз прямо сейчас:

$ systemctl start runme

Теперь давайте рассмотрим более сложный пример. Предположим, у вас есть сценарий Python (расположенный по адресу /etc/scripts/server.py), который необходимо запускать при загрузке, но после того, как сеть будет включена. Кроме того, вы хотите, чтобы он перезапускался при сбое, но не слишком часто. Если это похоже на ваш случай, используйте что-то вроде этого для своего служебного файла:

[Unit] 
Description=My awesome service 
After=network.target 
[Service] 
type=Simple 
User=username 
Restart=on-failure 
RestartSec=1 
StartLimitBurst=5 
StartLimitIntervalSec=10 
StartLimitAction=reboot 
ExecStart=/bin/python /etc/scripts/server.py 
[Install] 
WantedBy=multi-user.target

Здесь довольно много новых возможностей. Директива After определяет зависимость этой службы от цели network, которая инициализирует сетевое соединение. Позже мы укажем User для запуска сценария как username. Теперь есть пять вариантов управления отказоустойчивостью нашего сервиса.

Restart указывает, когда служба должна быть перезапущена. RestartSec не позволит systemd перезапускаться чаще, чем раз в секунду. StartLimitBurst и StartLimitIntervalSec говорят, что сервис может быть перезапущен не более пяти раз с интервалом в десять секунд. Наконец, StartLimitAction просит перезагрузить систему, если служба по-прежнему не работает после всех этих перезапусков. Очевидно, это не рекомендуется, если на вашем компьютере много жизненно важных служб. После настройки вы можете включить и запустить эту службу, как и все остальные.

Заключительные примечания

Спасибо, что прочитали, и я надеюсь, что вам понравилась эта статья. Пожалуйста, дайте мне знать ваше мнение о systemd - я слышал, что здесь довольно много споров.

Ресурсы