Создаем Systemd юнит (Unit) на примере Telegram бота

Вкратце, Systemd – система инициализации которая управляет службами в операционной системе Linux. На данный момент Systemd присутствует в таких дистрибутивах как Debian, Ubuntu, Linux Mint, Manjaro и во многих других.

С помощью Systemd можно создавать свои так называемые Unit (Юнит), тем самым автоматизировав необходимый процесс. Сам же юнит можно назвать скриптом, выполняющим определенные действия, если конечно прописать в него эти действия.

В данной статье рассмотрим пример создания Systemd юнита на примере Telegram бота. Можно конечно запускать Telegram боты используя и другие способы, как вариант, при помощи Cron, про Cron вы можете прочесть в отдельной статье, перейдя по этой ссылке, но, правильней конечно будет сделать этого Telegram бота юнитом Systemd на вашем сервере.

Подробней о том, что такое Systemd вы можете прочесть по этой ссылке.

Создаем Systemd юнит (Unit)

Работу подобного Systemd юнита вы можете наблюдать в Telegram канале Юморилка, где бот постит анекдоты. Все действия будут выполняться в Ubuntu 20.04, но, данный мануал подойдет и для всех остальных дистрибутивов, которые используют Systemd в качестве системы инициализации. Итак, для создания Systemd юнита отправляемся в терминал и создадим файл по адресу “/etc/systemd/system/”, затем необходимо придумать название создаваемого файла, пусть будет просто “bot”. Затем, ставим точку и указываем что это сервис – “.service”:

sudo nano /etc/systemd/system/bot.service

В открывшемся окне, в случае с Telegarm бота, вписываем следующие содержимое:

[Unit]
Description=Bot
After=syslog.target
After=network.target

[Service]
Type=simple
User=cyber-x
WorkingDirectory=/home/cyber-x/anekdot
ExecStart=/usr/bin/python3 /home/cyber-x/anekdot/anekdot.py
Restart=always

[Install]
WantedBy=multi-user.target

В поле “Description” вписываем название, в данном случае вписано просто “Bot”, вы можете вписать любое другое, которое заходите. В поле “User” вписываем имя пользователя, от которого будет запускаться данный Systemd юнит. Далее в полях WorkingDirectory вписываем путь, где расположен скрипт, затем указываем в поле “ExecStart” интерпретатор при помощи которого будет выполниться скрипт, в данном случае это “Python”, можно указать например “bash” для других скриптов, более подробно про интерпреторы вы можете прочесть перейдя по этой ссылке. После того как указали при помощи какого интерпретатора будет запускаться скрипт, указываем путь до файла, в нашем случае Telegram бот расположен по адресу “/home/cyber-x/anekdot/”, ну и конечно название самого файла “anekdot.py”:

Systemd юнит Unit на примере Telegram бота 1

Сохраняем файл сочетанием клавиш “ctrl + o”, нажимаем “Enter” и выходим из текстового редактора Nano – “ctrl + x”, подробнее про Nano можно прочесть в отдельной статье, доступной по этой ссылке.

Запуск Systemd юнита

Теперь необходимо запустить наш только что созданный Systemd юнит, для этого перезапустим сам Systemd что бы он увидел новый юнит:

sudo systemctl daemon-reload
Systemd юнит Unit на примере Telegram бота 2

Затем запускаем наш Systemd юнит командами:

sudo systemctl enable bot
sudo systemctl start bot
Systemd юнит Unit на примере Telegram бота 3

Проверить запустился наш юнит или выдал ошибку можно командой:

sudo systemctl status bot

Если в поле “Active” указано “active”, и он выделен зеленым цветом, значит, все нормально и наш Systemd юнит работает:

Systemd юнит Unit на примере Telegram бота 4

В ином случае будет выведено сообщение об ошибки. Для перезапуска Systemd юнита вводим команду:

sudo systemctl restart bot

Для остановки и выключения:

sudo systemctl stop bot

sudo systemctl disable bot

Типы Systemd юнитов

Службы в Systemd различаются по типу запуска, это следует учитывать при написании юнитов. Тип определяется параметром Type= в разделе [Service]:

  • Type=simple (по умолчанию): systemd запустит эту службу незамедлительно. Процесс при этом не должен разветвляться (fork). Если после данной службы должны запускаться другие, то этот тип использовать не стоит (исключение — служба использует сокетную активацию).
  • Type=forking: systemd считает службу запущенной после того, как процесс разветвляется с завершением родительского процесса. Используется для запуска классических демонов за исключением тех случаев, когда в таком поведении процесса нет необходимости. Укажите параметр PIDFile=, чтобы systemd мог отслеживать основной процесс.
  • Type=oneshot: удобен для сценариев, которые выполняют одно задание и завершаются. Если задать параметр RemainAfterExit=yes, то systemd будет считать процесс активным даже после его завершения.
  • Type=notify: идентичен параметру Type=simple, но с уточнением, что демон пошлет systemd сигнал готовности. Реализация уведомления находится в библиотеке libsystemd-daemon.so.
  • Type=dbus: служба считается находящейся в состоянии готовности после появления указанного BusName в системной шине DBus.
  • Type=idle: systemd отложит выполнение двоичного файла службы до окончания запуска остальных (“более срочных”) задач. В остальном поведение аналогично Type=simple.

Более подробно про типы в Systemd можно прочесть в Arch Wiki, либо, на Хабре имеется отличная статья про создание Systemd юнитов.

Заключение

В данной статье мы рассмотрели простой пример создания Systemd юнита на примере Telegram бота, при желании, можно запустить таким образом Telegram бот на сервере и он будет у вас работать. Стоит отметить, что для этого не обязательно арендовать сервер под эти нужды, если у вас имеется Raspberry Pi или старый компьютер, который лежит без дела, можно поднять на нем сервер установив операционную систему Linux, написать Systemd юнит и запустить на нем Telegam бота.

Собственно, именно таким образом работает Юморилка, по сути, это Telegram бот который постит анекдоты, а расположен он на Raspberry Pi, на которой создан Systemd юнит. Работает без каких либо проблем вот уже достаточно продолжительное время.

Можно таким образом запускать не только Telegram ботов, но и остальных ботов для других сервисов или вообще автоматизировать многие процессы которые вы выполняете вручную. Для этого достаточно написать скрипт и создать Systemd юнит, который будет выполняться.

А на этом сегодня все, если статья оказалась вам полезна, подписывайтесь на рассылку журнала в pdf формате, а так же на социальные сети журнала Cyber-X:

YouTube
ВКонтакте
Telegram
Twitter
Tumblr

Юморилка, Telegram канал с анекдотами:
Telegram

1С – Обучение, Доработка, Консультация:
РК-Центр

По вопросам работы сайта, сотрудничества, а так же по иным возникшим вопросам пишите на E-Mail. Если вам нравится журнал и вы хотите отблагодарить за труды, вы можете перечислить донат на развитие проекта.

С уважением, редакция журнала Cyber-X

Добавить комментарий

Ваш адрес email не будет опубликован.