Как создать юнит-сервис systemd в Linux
Systemd — это современный программный пакет, который предоставляет множество компонентов в системе Linux, включая менеджер системы и служб. Он совместим с SysV и LSB init-скриптами и работает как замена sysvinit.
Сервис systemd определяется в файле юнита (юнит — это представление сервиса и системных ресурсов, таких как устройства, сокеты, точки монтирования и т. д.). Пользовательские файлы юнитов сервисов должны храниться в директории /etc/systemd/system/ и должны иметь расширение .service. Например, пользовательский сервис test-app использует файл юнита /etc/systemd/system/test-app.service.
Файл юнита — это текстовый файл в стиле ini, который обычно включает три общих раздела. Первый раздел обычно называется Unit и содержит общую информацию о юните, которая не зависит от типа юнита.
Следующий раздел — это раздел типа единицы, для службы это раздел Служба. А последний раздел — это раздел Установка, который содержит информацию об установке для единицы.
В этом руководстве мы покажем, как создать новую службу systemd и управлять этой службой с помощью команды systemctl в Linux.
Создание собственного файла службы Systemd в Linux
Чтобы запускать приложение, программу или скрипт как службу под systemd, вы можете создать новую службу systemd следующим образом. Начните с создания файла unit службы с именем test-app.service (не забудьте заменить test-app на фактическое имя вашей службы или приложения) в директории /etc/systemd/system/:
# vi /etc/systemd/system/test-app.service
Следующая конфигурация используется для определения сервиса для запуска Flask приложения с использованием Gunicorn, Python WSGI HTTP сервера для UNIX.
[Unit]
Description=Gunicorn daemon for serving test-app
After=network.target
[Service]
User=root
Group=root
WorkingDirectory=/apps/test-app/
Environment="PATH=/apps/test-app/bin"
ExecStart=/apps/test-app/bin/gunicorn --workers 9 -t 0 --bind 127.0.0.1:5001 -m 007 wsgi:app --log-level debug --access-logfile /var/log/gunicorn/test_app_access.log --error-logfile /var/log/gunicorn/test_app_error.log
ExecReload=/bin/kill -s HUP $MAINPID
RestartSec=5
[Install]
WantedBy=multi-user.target
Давайте кратко опишем каждую директиву конфигурации в приведённой выше конфигурации:
- Описание - используется для указания описания услуги.
- After - определяет зависимость от второго юнита, network.target. В этом случае, test-app.service активируется после юнита network.target.
- Пользователь - используется для указания пользователя, с правами которого будет выполняться служба.
- Группа - используется для указания группы, с разрешениями которой будет запускаться служба.
- WorkingDirectory - используется для установки рабочей директории для выполняемых процессов.
- Окружение - используется для установки переменных окружения для выполняемых процессов.
- ExecStart - используется для определения команд с их аргументами, которые выполняются при запуске этой службы.
- ExecReload - используется для определения команд, которые необходимо выполнить для перезагрузки конфигурации в службе.
- WantedBy — позволяет создать символическую ссылку в каталоге
.wants/или.requires/каждого из указанных юнитов, в данном случае multi-user.target, когда юнит test-app.service включается с помощью команды systemctl enable.
Вы можете найти все параметры конфигурации сервисного юнита, хорошо описанные в документации по конфигурации сервисного юнита.
Сохраните файл юнита и закройте его. Затем перезагрузите systemd с этим новым файлом юнита службы, выполнив:
# systemctl daemon-reload command
Не забывайте всегда выполнять эту команду после редактирования файла юнита.
Управление сервисом Systemd в Linux
Чтобы запустить/активировать сервис, выполните команду systemctl следующим образом:
# systemctl start test-app.service
Чтобы проверить, работает ли служба или нет, выполните команду systemctl, как показано.
# systemctl status test-app.service
Чтобы разрешить запуск службы при загрузке системы, используйте команду systemctl enable. Вы можете проверить, была ли служба включена, используя команду systemctl is-enabled следующим образом:
# systemctl enable test-app.service
# systemctl is-enabled test-app.service
В качестве альтернативы, вы также можете включить и запустить службу одновременно, как показано.
# systemctl enable --now test-app.service
Чтобы остановить/деактивировать службу, выполните команду systemctl stop следующим образом:
# systemctl stop test-app.service
Чтобы перезапустить службу, выполните команду systemctl restart следующим образом:
# systemctl restart test-app.service
Вы также можете отключить службу, чтобы предотвратить её запуск при загрузке системы, используя команду systemctl disable. Вы можете проверить, была ли служба включена, используя команду systemctl is-enable следующим образом:
# systemctl disable test-app.service
# systemctl is-disabled test-app.service
В качестве альтернативы вы можете одновременно отключить и остановить его, как показано.
# systemctl disable --now test-app.service
Для получения более подробной информации о управлении службами systemd и другими ресурсами выполните:
# man systemctl

