Создаем Unit в Linux
Что такое 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 указывает на запуск в многопользовательском режиме без графики