Что такое службы (unit) в Linux
В операционной системе Linux, так же как и в Windows, кроме обычных программ, с которыми может взаимодействовать пользователь есть еще один вид программ. Это работающие в фоне службы. Важность служб тяжело переоценить, они следят за состоянием системы, обеспечивают автоматическое подключение внешних устройств и сети, позволяют процессам взаимодействовать с оборудованием, а также в виде служб реализованы различные веб-серверы и серверы баз данных.
Поскольку службы выполняются в фоновом режиме, вы не можете взаимодействовать с ними привычными способами.
Systemd
система которая позволяет запускать службы параллельно учитывая зависимости между службами. Порядок запуска служб определяет сложное дерево зависимостей. После запуска системы Systemd
собирает весь вывод службы в лог, и следит за ее работой, если служба аварийно завершилась, то автоматически ее перезапускает при необходимости. Вместе с подсистемой Systemd
появилась команда systemctl.
Служба в Systemd
описывается файлом unit
, в нем описано каким образом эту службу надо запускать, а также как с ней себя вести.
Типы юнитов
Существуют такие типы юнитов:
service
обычная служба, программаtarget
группа службautomount
точка автоматического монтированияdevice
файл устройства, генерируется на этапе загрузкиmount
точка монтированияpath
файл или папкаscope
внешний процессslice
группа системных служб systemdsnapshot
сохраненное состояние запущенных службsocket
позволяет активировать службу по необходимости.
Все службы Systemd
можно поделить на три группы, которые находятся в разных дирикториях:
/usr/lib/systemd/system/
юниты, установленные с помощью пакетовRPM
,DEB
/run/systemd/system/
юниты, созданные в рантайме/etc/systemd/system/
юниты, созданные системным администратором
Кроме того, у Systemd
есть задачи Jobs
, они выполняются и видны только когда к какой нибудь службе применяется действие, например, запуск или остановка.
Создание сервиса
В подсистеме Systemd
также можно легко создать собственную службу и использовать ее для автозапуска приложений или собственных скриптов. Для этого в каталоге /usr/lib/systemd/system
создаем юнит, который по суте является файлом с расширением .service
.
Как правило, файл разделен на 3 части:
Unit
позволяет определить метаданные для юнитаService
раздел для основной конфигурации юнитаInstall
определение поведения для юнита при его включении или отключении
Раздел Unit - декларация модуля и его свойства
Description
описание модуляAfter
запуск модуля после запуска определенных службRequires
указание что для запуска сервиса необходим другой запущенный сервисWants
декларация что для запуска сервиса необходим другой запущенный сервисDocumentation
источник Документация к сервису
Раздел Service - указание какими командами и под каким пользователем надо запускать сервис
Type
тип сервисаWorkingDirectory
установка рабочего каталога, он делается текущим перед запуском стартап командUser
пользователь , под которым надо стартовать сервисGroup
группа, под которым надо стартовать сервисEnvironment
переменные окруженияExecStart
команда для запуска сервисаExecStop
команда для остановки сервисаRestart
указание, стратегии перезапуска сервисаRestartSec
время ожидания перед повторным запуском службы в секундахStandardOutput
указание, куда перенаправлять стандартный поток выводаStandardError
указание, куда перенаправлять поток ошибокTimeoutStartSec
таймаут перед запуском службы
Раздел Install - описание уровня запуска сервиса
WantedBy
указание уровня запуска
Запуск сервиса
После внесения изменений и сохранения файла, необходимо перечитать изменения командой:
systemctl daemon-reload
Теперь можно разрешить автозапуск, для примера ниже, команда будет следующая:
systemctl enable gfagent
Пример юнита
gfagent.service [Unit]
Description=Gitflic-runner
After=gitflic.service
Requires=gitflic.service
[Service]
User=gitflic-agent
Group=gitflic-agent
WorkingDirectory=/home/gitflic-agent/gitflic-runner
ExecStart=/usr/bin/java -jar runner.jar start --config=config/application.properties
ExecStop=/bin/kill -s 15 $MAINPID
StandardOutput=journal
StandardError=journal
Restart=on-failure
RestartSec=10
TimeoutStartSec=2min
[Install]
WantedBy=multi-user.target