Создаем Unit в Linux

Материал из wiki.ramba-art.ru
Версия от 14:44, 25 марта 2023; Admin (обсуждение | вклад) (Новая страница: «Что такое systemd? systemd — это набор базовых строительных блоков для системы Linux. Он предоставляет диспетчер систем и служб, который работает как PID 1 и запускает остальную часть системы. systemd предоставляет агрессивные возможности распараллеливания, исполь...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Что такое systemd?

systemd — это набор базовых строительных блоков для системы Linux. Он предоставляет диспетчер систем и служб, который работает как PID 1 и запускает остальную часть системы. systemd предоставляет агрессивные возможности распараллеливания, использует активацию сокетов и D-Bus для запуска служб. Предлагает запуск демонов по требованию, отслеживает процессы, использующие группы управления Linux. Поддерживает точки монтирования и автоматического монтирования. Реализует сложную логику управления службами на основе транзакционных зависимостей. systemd поддерживает сценарии SysV и LSB init и работает как замена для sysvinit. Другие части включают демон ведения журнала, утилиты для управления базовой конфигурацией системы. В него входит: имя хоста, дата, локаль, ведение списка зарегистрированных пользователей и запущенных контейнеров. А также виртуальных машин, системные учетные записи, каталоги времени выполнения и параметры. Не забудем о демонах управления простой конфигурацией сети, синхронизацией сетевого времени, пересылкой журналов и разрешением имен.

unitd работает с сервисами описанными в своей конфигурации. Основой для создания сервиса служит юнит (unit) — это текстовый файл с описанием на подобии ini файла в системе windows. Конфигурационный файл состоит из секций. Внутри каждой секции указываются необходимые параметры. Обязательными во всех юнитах являются две секции, остальные используются в зависимости от типа юнита.

Приступим

например в /opt/telegram/start/ создаем фаил имя_програмы.sh

в нем пишем:

 #!/bin/bash
 /usr/bin/python3 /opt/telegram/папка_с_pyton_програмой/main.py

Создаем фал в сисди

nano /etc/systemd/system/имя_нашей_программы.service

Вставляем следующее:

Description= описывавшем нашу программу в пару слов

After=network.target

 [Service]
 User=имя_пользователя_от_которого_будет_запускаться_программа
 Nice=1
 KillMode=none
 SuccessExitStatus=0 1
 ProtectHome=true
 ProtectSystem=full
 PrivateDevices=true
 NoNewPrivileges=true
 WorkingDirectory=/opt/telegram/папка_с_pyton_програмой
 ExecStart=/opt/telegram/start/имя_програмы.sh
 [Install]
 WantedBy=multi-user.target

далее:

systemctl start имя_нашей_программы.service

systemctl status имя_нашей_программы.service

если всё oK, то:

systemctl enable имя_нашей_программы.service - это будет запускать нашу программу при старте системы.


Полезное:

Каталоги хранения юнитов

 /usr/lib/systemd/system — юниты поставляемые вместе с системой и устанавливаемыми приложениями
 /run/systemd/system — юниты созданные динамически (в рантайме)
 /etc/systemd/system — юниты системного администратора (тут и будем хранить наши)

Юниты systemd

 target — группирует модули
 service — отвечает за запуск сервисов (служб) и поддерживает вызов интерпретаторов для исполнения пользовательских скриптов
 mount — занимается монтированием файловых систем
 automount — автомонтирование файловых систем, используется при обращении к точке монтирования;
 swap — отвечает за подключение файла подкачки
 timer — запускает модули по расписанию, аналог cron
 socket — запуск модуля при подключению к сокету
 slice — группировка других модулей в контейнер (дерево) cgroups
 device — использует реакцию на подключение какого-либо устройства
 path — запуск модуля по событию доступа по конкретному пути в файловой системе
 [Unit]
 Description — описание юнита для большего понимания
 Documentation — документация по процессу sshd
 After — зависимость, т.е. в данном случае запускать юнит только после запуска network.target и sshd-keygen.target
 Wants — еще одна зависимость, означает желательно. В примере Wants=sshd-keygen.target, т.е. желательно чтобы было запущено sshd-keygen.target . Желательно но не обязательно.
 [Service]
 Type — типы запуска служб. Могут быть
 simple (по умолчанию) — происходит незамедлительный запуск этой службы, с учетом того что процесс не разветвляется (fork). Не используйте simple если пользуетесь очередностью запуска. Одно исключение это активация сокета.
 forking — служба считается запущенной после того, после разветвления процесса с завершением родительского процесса. Используется для запуска классических демонов исключая случаи, когда в таком поведении процесса нет необходимости. Также желательно указать PIDFile=, чтобы systemd мог отслеживать основной процесс.
 oneshot — удобен для скриптов, которые выполняют одно задание и завершаются. При необходимости можно задать параметр RemainAfterExit=yes, чтобы systemd считал процесс активным даже после его завершения.
 notify — идентичен параметру simple, но с оговоркой, что демон пошлет systemd сигнал о своей готовности. Эталонная реализация данного уведомления представлена в libsystemd-daemon.so.
 
 dbus — служба считается находящейся в состоянии готовности, когда указанный параметр BusName появляется в системной шине DBus.
 idle — откладывается выполнение двоичного файла службы до момента выполнения всех остальных задач. В остальном поведение аналогично simple.

Далее в разделе Service

 EnvironmentFile — файлы переменного окружения
 ExecStart — полный путь к исполняемому файлу программы с параметрами запуска
 ExecReload — полный пусть к исполняемому файлу программы с параметрами перезапуска программы
 KillMode — указывается как будет завершен процесс. В данному случае параметр process говорит о том что будет закрыт только главный процесс
 Restart — перезагрузка процесса, параметр on-failure указывает на автоматическую перезагрузку в случает отказа процесса
 RestartSec — время ожидания через которое процесс должен перезагрузиться
 [Install]
 WantedBy — указывает на каком урове запуска стартует сервис, параметр multi-user.target указывает на запуск в многопользовательском режиме без графики