Systemd — это мощная и универсальная система инициализации для дистрибутивов Linux. Она может запускать программы, управлять системными ресурсами и даже контролировать состояние вашего компьютера. В этой статье мы покажем, как можно использовать Systemd для управления приложениями, создав пользовательскую службу в Ubuntu.
Что такое сервисный модуль Systemd?
Сервисный модуль — это обычный файл, содержащий сведения о том, как запустить конкретное приложение. Он включает в себя общие метаданные программы, сведения о том, как её запустить, и о том, может ли Systemd получить к ней доступ в обычном сеансе.
По умолчанию каждый демон на компьютере, работающем на базе Systemd, имеет файл службы в той или иной форме. Например, OpenSSH использует модуль ssh.service в «/etc/systemd/system/», чтобы определить, как он будет работать в Debian и Ubuntu.
На базовом уровне файл служебного модуля состоит из трёх частей: категорий «Unit», «Service» и «Install». Раздел Unit
содержит метаданные приложения и его зависимости. Раздел Service
определяет, где находится приложение и как Systemd будет его запускать. Наконец, в разделе Install
описывается, когда Systemd может запустить приложение.
Создание пользовательской службы Systemd системного уровня
Одно из наиболее распространённых применений пользовательских служб — автоматизация команд, требующих прав суперпользователя, или использование преимуществ таймеров Systemd. Например, пользовательская служба помогает обеспечить корректный запуск сервера Minecraft после перезагрузки.
Чтобы создать пользовательскую службу системного уровня в Linux, начните с создания файла модуля Systemd в домашнем каталоге вашего пользователя:
nano ~/my-system-app.service
Вставьте следующий блок кода в свой новый файл конфигурации. Это самая простая допустимая конфигурация для службы Systemd:
[Unit] Description=My First Service After=network.target [Service] Type=simple ExecStart=/path/to/bin Restart=always [Install] WantedBy=multi-user.target
Замените переменную «Description» на сведения о вашей услуге на уровне пользователя.
Замените переменную «ExecStart» на полный путь к программе, которую вы хотите запустить.
Сохраните новый файл, а затем скопируйте его в каталог служб вашего компьютера:
cp sudo ./my-system-app.service /etc/systemd/system/
Выполните следующую команду, чтобы перезапустить демон Systemd:
sudo systemctl daemon-reload
Протестируйте свою новую службу системного уровня, выполнив следующую команду:
sudo systemctl start my-system-app.service
Наконец, убедитесь, что ваш новый сервис работает правильно, проверив его статус в systemctl:
systemctl status my-system-app.service
Создание пользовательской службы Systemd на уровне пользователя
Сервисные модули не ограничиваются приложениями системного уровня или суперпользователями. С помощью Systemd-user можно создавать сервисы без прав суперпользователя. Это позволяет пользователям без прав суперпользователя управлять локальными приложениями и повышать безопасность своего ПК, ограничивая программы с правами суперпользователя.
Чтобы создать пользовательскую службу в Linux, создайте новый файл модуля Systemd в домашнем каталоге пользователя:
nano ~/my-user-app.service
Вставьте следующий блок кода в ваш новый модульный файл:
[Unit] Description=My First User Service After=graphical-session.target [Service] Type=simple ExecStart=/path/to/bin [Install] WantedBy=default.target
Замените значение переменной «ExecStart» на путь к программе, которую вы хотите запустить. Поскольку это служба пользовательского уровня, убедитесь, что у вашей учётной записи есть доступ к исполняемому файлу.
Сохраните новый файл службы на уровне пользователя, затем создайте локальный каталог Systemd для своего пользователя:
mkdir -p ~/.config/systemd/user/
Скопируйте новый файл службы пользовательского уровня в локальный каталог Systemd для вашего пользователя:
cp ./my-user-app.service ~/.config/systemd/user/
Убедитесь, что Systemd проверяет ваш пользовательский каталог на наличие новых файлов service unit:
systemctl daemon-reload --user
Наконец, убедитесь, что ваш новый сервис работает правильно, проверив его статус в systemctl:
systemctl --user status my-user-app.service
Полезно знать: Systemd — это не просто система инициализации. Узнайте, как работает родственная ей программа: Systemd-boot в сравнении с популярным GRUB.
Настройка вашей пользовательской службы Systemd
Одним из основных преимуществ Systemd является то, что он позволяет полностью настраивать запуск программ и управление ими.
Добавление переменных окружения в пользовательский сервис
Переменные среды — важная часть любой системы Linux. Они предоставляют программе дополнительные данные без необходимости возиться с файлами конфигурации. С помощью Systemd можно использовать переменные среды, включив их в свои служебные модули.
Начните с отключения службы, которую вы хотите изменить:
systemctl --user disable --now my-user-app.service
Откройте свой пользовательский служебный файл с помощью вашего любимого текстового редактора:
sudo nano ~/.config/systemd/user/my-user-app.service
Перейдите в раздел «[Сервис]» и добавьте следующую строку кода чуть ниже переменной «Type=»:
Environment=""
Добавьте переменную среды, которую вы хотите добавить в свой пользовательский сервис. В нашем случае мы хотим добавить переменную EDITOR, чтобы наш сервис мог видеть наш экземпляр Vim.
Сохраните изменённый файл службы, а затем перезапустите демон Systemd, чтобы применить изменения.
destroyer@andreyex: -$ nano ~/.config/systemd/user/my-user-app.service destroyer@andreyex: $ systemctl daemon-reload --user
Перезапустите вашу новую службу Systemd, чтобы использовать вашу новую переменную окружения:
systemd --user start my-user-app.service
Ограничение пользовательского сервиса конкретным пользователем
Помимо файлов модулей пользовательского уровня, вы также можете настроить службу системного уровня для запуска от имени конкретного пользователя. Это полезно, если вы хотите запустить приложение от имени пользователя без прав суперпользователя и без оболочки.
Чтобы привязать службу Systemd к пользователю, сначала полностью отключите свой пользовательский модуль.
destroyer@andreyex: $ sudo systemctl disable --now my-system-app.service
Убедитесь, что учетная запись целевого пользователя уже существует на вашем компьютере.
destroyer@andreyex: -$ echo $USER destroyer@andreyex: $ sudo -s root@andreyex:/home/destroyer# su minecraft $ echo $USER
Откройте служебный файл системного уровня с помощью вашего любимого текстового редактора:
sudo nano /etc/systemd/system/my-system-app.service
Прокрутите вниз до раздела «[Сервис]», затем добавьте переменную «User=», а затем имя вашей учётной записи.
Примечание: вы также можете указать группу для своего сервиса, добавив «Group=» под переменной «User».
Сохраните изменения в файле вашего устройства, затем перезапустите службу:
sudo systemctl start my-system-app.service
Убедитесь, что ваш сервис теперь работает от имени вашего пользователя, выполнив следующую команду:
ps -o user= -p $(systemctl show my-system-app.service -p MainPID | awk -F= '{print $2}')
Ограничение потребления ресурсов Сервисной единицей
Помимо настройки переменных среды и пользователей, Systemd может ограничивать ресурсы, которые приложение может потреблять в течение своего жизненного цикла. Хотя по умолчанию это не делается, можно контролировать основные параметры, такие как загрузка процессора и общее количество процессов.
Начните с полного отключения службы, которую вы хотите настроить.
destroyer@andreyex:~$ sudo systemctl disable --now my-app.service destroyer@andreyex:~$ sudo systemctl status my-system-app.service
Откройте файл service unit с помощью вашего любимого текстового редактора:
sudo nano /etc/systemd/system/my-system-app.service
Прокрутите вниз до раздела «[Service]» и добавьте имя переменной для ресурса, который вы хотите ограничить. Например, добавление переменной «MemoryHigh=» позволяет установить мягкое ограничение памяти для этой службы.
Совет: вы можете найти список допустимых переменных, выполнив следующую команду в терминале:
man systemd.resource-control
Сохраните файл unit, затем перезагрузите службу Systemd:
sudo systemctl enable --now my-system-app.service
Наконец, вы можете отслеживать свои запущенные службы, запустив systemd-cgtop
.
Изучение того, как создавать собственные службы Systemd и изменять их в соответствии с вашими потребностями, — это лишь первый шаг к пониманию этого очень универсального инструмента.