Вкратце, 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”:

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

Затем запускаем наш Systemd юнит командами:
sudo systemctl enable bot
sudo systemctl start bot

Проверить запустился наш юнит или выдал ошибку можно командой:
sudo systemctl status bot
Если в поле “Active” указано “active”, и он выделен зеленым цветом, значит, все нормально и наш Systemd юнит работает:

В ином случае будет выведено сообщение об ошибки. Для перезапуска 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