Systemd на Linux – Контроль служб, режимов работы и ведение журналов

Systemd представляет собой не только менеджер служб, но и полноценную систему управления для Linux. Он создан с учетом обратной совместимости с SysV init скриптами и внедрен во многих известных дистрибутивах Linux, таких как Debian 8+, Ubuntu 15.04+, Fedora, Redhat 7+ / CentOS 7+, Arch Linux и OpenSUSE. Поэтому освоение работы с systemd станет весьма полезным навыком.

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

systemd --version

systemctl --version

Контроль за работой служб

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

Для получения списка активных служб systemd выполните

systemctl list-units --type service

Узнайте состояние определённой службы, например, демона SSH.

systemctl status ssh

Для запуска службы воспользуйтесь подкомандой start.

sudo systemctl start ssh

Убедитесь, что она функционирует

systemctl is-active ssh

Активируйте службу для автоматического запуска при старте системы.

sudo systemctl enable ssh

Убедитесь, что она активирована.

systemctl is-enabled ssh

Отключите автоматический запуск службы при старте системы.

sudo systemctl disable ssh

sudo systemctl stop ssh

Вы деактивировали службу systemd, но она почему-то вновь активировалась? Чтобы избежать её ручного запуска, примените подкоманду mask.

sudo systemctl mask ssh

Заблокированные службы нельзя запустить с помощью команды systemctl start, пока их не разблокируют.

sudo systemctl unmask ssh

Иногда можно заметить, что неизвестный процесс запущен, используя команду htop. Если вы хотите его остановить, но не уверены, к какой службе systemd он относится, попробуйте выполнить следующую команду.

systemctl status

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

Управление этапами деятельности

В systemd концепция уровней работы была заменена на цели. Цель multi-user. target соответствует уровню работы 3, в то время как graphical. target аналогичен уровню работы 5. Тем не менее, вы по-прежнему можете использовать команду runlevel для отображения текущего уровня работы.

Читайте также:  Как отредактировать файл hosts на вашей системе

runlevel

Для проверки состояния целевой цели по умолчанию, которая обычно представляет собой графическую цель (уровень работы 5), используйте следующую команду.

systemctl status default. target

Для изменения текущей цели используется команда systemctl isolate. К примеру, можно переключиться на multi-user. target (уровень 3 работы):

sudo systemctl isolate multi-user. target

Чтобы вернуться к графической задаче (уровень выполнения 5):

sudo systemctl isolate graphical. target

Чтобы задать multi-user. target в качестве стандартной цели, выполните следующую команду:

sudo systemctl set-default multi-user. target

Данная команда устанавливает символическую ссылку.

Если вы выполните перезагрузку в данный момент, вы окажетесь в целевой многопользовательской игре.

Чтобы получить перечень действующих целей, выполните

systemctl list-units --type target

Управление записями в журналах

Пакет systemd содержит утилиту journalctl, предназначенную для работы с журналами в Linux. Обычно журналы в Linux хранятся в папке /var/log/. Однако в дистрибутивах Linux, использующих systemd, вы можете не обнаружить такие журналы, как почтовые логи postfix (/var/log/mail.log), в этой папке.

Для просмотра последних журналов используйте следующую команду. Для перехода на следующую страницу нажмите клавишу F, а для возврата на предыдущую — клавишу B. Чтобы выйти, нажмите Q.

sudo journalctl

Применяйте команду grep для нахождения записей в журналах, относящихся к вашему запросу.

sudo journalctl | искать

Изучите журналы начиная с последней загрузки.

sudo journalctl - b

Просмотрите записи с момента последней загрузки журналов.

sudo journalctl - b -1

Вот простой способ отображать логи, создаваемые в реальном времени.

sudo journalctl - f

Примеры использования команды journalctl

Отобразить журналы работы юнита, например, юнита службы SSH.

sudo journalctl - u ssh

Для просмотра логов Postfix используйте следующую команду.

sudo journalctl - u postfix

Некоторые пакеты можно настроить так, чтобы они сохраняли журналы в обычные файлы, например, файлы логов Postfix на Ubuntu (/var/log/mail.log). Вы можете использовать текстовый редактор в командной строке для просмотра этих логов. В некоторых случаях служба systemd может прекратить генерацию лог-сообщений; для решения этой проблемы можно попробовать перезапустить rsyslog.

sudo systemctl restart rsyslog

Службы, находящиеся в противоречии

Если две службы не могут работать параллельно, стоит воспользоваться параметром Conflicts. Например, на моем настольном компьютере с Ubuntu я постоянно использую VPN. Это самоуправляемый VPN, размещённый на VPS. Временами я запускаю Transmission для скачивания торрентов. Однако, когда я включаю Transmission, мне приходится отключать VPN, так как Vultr приостанавливает работу аккаунта, если их серверы используются для загрузки торрентов (имеется в виду скачивание контента с нарушением авторских прав через BitTorrent).

Читайте также:  Сертификация Red OS - соответствие требованиям ФСТЭК России

Я способен внести изменения в файл transmission-daemon.service.

sudo nano /lib/systemd/system/transmission-daemon.service

Включите следующую строку в раздел [Unit].

Conflicts=openconnect.service

сервисы systemd, находящиеся в конфликте

Сохраните файл и закройте его. После этого обновите systemd, чтобы изменения начали действовать.

sudo systemctl daemon-reload

openconnect.service — это служба, отвечающая за инициацию VPN-соединения на моем ПК. Теперь, если я активирую transmission-daemon.service, openconnect.service будет автоматически приостановлена, и наоборот.

Зависимости

Чтобы настроить автоматический запуск службы B при старте службы A, воспользуйтесь параметром Wants. В разделе [Unit] вашего файла.service systemd добавьте строку, аналогичную следующей:

[Unit] Wants = b.service

Также можно применять Before = или After = для определения последовательности.

[Unit] Wants = b.service Before = b.service

Иногда возникает необходимость сделать так, чтобы служба B запускалась только после завершения работы службы A. В этом случае вам следует добавить следующие строки в раздел [Service] файла b.service.

[Service] ExecStartPre=/bin/sleep 20

b.service сообщает, что необходимо подождать 20 секунд.

Не забудьте перезапустить systemd для применения изменений.

sudo systemctl daemon-reload

Запуск сценариев из файла /etc/rc. local

Если вы работаете с дистрибутивом Linux на базе Systemd, возможно, вы заметили, что команды в файле /etc/rc. local не исполняются при старте системы. В этом руководстве мы рассмотрим, как активировать выполнение скрипта /etc/rc. local во время загрузки.

  • Как активировать /etc/rc. local в системе Systemd

Учет

Systemd предоставляет возможность отслеживать использование CPU и памяти службой, а также количество выполняемых задач. В современных дистрибутивах Linux, таких как Ubuntu 20.04, Debian 10 и RHEL 8, эта функция активирована по умолчанию. В более старых версиях, например, в Ubuntu 18.04, необходимо включить её вручную. Если вы хотите активировать учёт для Nginx в Ubuntu 18.04, следуйте приведённым ниже рекомендациям.

Для начала создайте папку, где будут храниться пользовательские настройки systemd для Nginx.

sudo mkdir - p /etc/systemd/system/nginx.service.d/

Создайте файл с пользовательскими настройками в данном каталоге. Имя файла должно заканчиваться на.conf.

sudo nano /etc/systemd/system/nginx.service.d/custom.conf

После этого вставьте следующие строки в данный файл.

Читайте также:  Настройка репликации Master-Slave MariaDB на Debian 8

[Service] CPUAccounting=true MemoryAccounting=true TasksAccounting=true

Сохраните изменения в файле и закройте его. После этого перезапустите systemd.

sudo systemctl daemon-reload

Нет нужды перезапускать Nginx. Теперь вы можете узнать статус Nginx с помощью:

systemctl status nginx

Учет в systemd

Конфигурация пользователя для шаблона службы systemd.

Возможно, вы встречали шаблон systemd, в котором используется символ @, например, в службе Syncthing.

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

sudo systemctl start syncthing@ user1.service sudo systemctl start syncthing@ user2.service

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

sudo mkdir - p /etc/systemd/system/syncthing@ user1.service.d sudo mkdir - p /etc/systemd/system/syncthing@ user2.service.d

После этого вы можете сформировать файл индивидуальных настроек.

sudo nano /etc/systemd/system/syncthing@ user1.service.d/custom.conf sudo nano /etc/systemd/system/syncthing@ user2.service.d/custom.conf

После того как вы сохранили внесенные изменения, обновите systemd.

sudo systemctl daemon-reload

Таймеры в системе systemd

Что делать, если вы предпочитаете, чтобы служба systemd не запускалась автоматически при загрузке системы, а активировалась в определенное время? В этом случае можно создать таймер systemd для нужной службы. К примеру, я разработал службу systemd (/etc/systemd/system/iris.service) для программного обеспечения Iris, предназначенного для защиты глаз.

[Unit] Description=Программное обеспечение защиты глаз Iris After=lightdm.service [Service] Type=oneshot Environment=DISPLAY=:0 User=ваше_имя_пользователя ExecStart=/bin/bash - c 'DISPLAY=:0 xhost 127.0.0.1 && /opt/iris/Iris. sh' KillSignal=SIGINT Restart=on-failure RestartSec=2 [Install] WantedBy=multi-user. target

Безусловно, я могу настроить его на автоматический запуск при загрузке с помощью:

sudo systemctl enable iris.service

Как сделать так, чтобы он работал только в ночное время? Мне требуется настроить таймер в systemd.

sudo nano /etc/systemd/system/iris. timer

Вставьте указанные строки в этот файл. Данный таймер systemd будет запускать iris.service ежедневно в 18:00:00.

[Unit] Description=Таймер ночного режима Iris Requires=iris.service [Timer] Unit=iris.service OnCalendar=*-*-* 18:00:00 [Install] WantedBy=timers. target

Сохраните файл и закройте его. После этого активируйте таймер systemd.

sudo systemctl enable iris. timer

Убедитесь в текущем состоянии данного таймера.

sudo systemctl status iris. timer

iris. timer - Таймер ночного режима Iris Загружено: загружено (/etc/systemd/system/iris. timer; включено; предустановка от производителя: включена) Активно:активный (в ожидании) since Sat 2022-05-07 19:38:22 +08; 24min ago Trigger: Sun 2022-05-08 18:00:00 +08; 22h left Triggers: ● iris.service

Заключение

Это всё! Присоединяйтесь к нашей бесплатной рассылке, чтобы быть в курсе последних учебников по Linux. Также вы можете следить за нами в Twitter или оценить нашу страницу в Facebook.