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 для отображения текущего уровня работы.
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

Отобразить журналы работы юнита, например, юнита службы 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).
Я способен внести изменения в файл transmission-daemon.service.
sudo nano /lib/systemd/system/transmission-daemon.service
Включите следующую строку в раздел [Unit].
Conflicts=openconnect.service

Сохраните файл и закройте его. После этого обновите 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
После этого вставьте следующие строки в данный файл.
[Service] CPUAccounting=true MemoryAccounting=true TasksAccounting=true
Сохраните изменения в файле и закройте его. После этого перезапустите systemd.
sudo systemctl daemon-reload
Нет нужды перезапускать Nginx. Теперь вы можете узнать статус Nginx с помощью:
systemctl status nginx

Конфигурация пользователя для шаблона службы 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.

