Что такое службы (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