Поиск по сайту:

Как создать юнит-сервис 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