Найти в Дзене
Записки сисадмина

Linux. Создание собственного демона в systemd.

Оглавление

Ну что же: демоны.

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

Маленькие фишки демонов:

  • Фоновая работа - Демоны работают в фоне и не требуют активного вмешательства пользователя.
  • Периодическая или непрерывная работа - Они могут выполнять задачи по расписанию (например, cron) или реагировать на события и запросы в реальном времени.
  • Отсутствие привязки к терминалу - Демоны не привязаны к конечному терминалу, что позволяет им продолжать работу даже после выхода пользователя из системы.

Сколько бы споров в интернете ни велось, как бы ни поливали разными субстанциями systemd, именно systemd во всех современных дистрибутивах Linux управляет демонами.

Практически все системные и сетевые службы, которым необходимо работать постоянно, устанавливаются в систему как демоны (например, MySQL, Apache, Nginx, SSH, Iptables)

Так для чего же нам могут понадобиться самописные демоны:

  • Автоматизация задач - вы можете создать сервис, который будет автоматически выполнять определенные задачи (например, запускать скрипты, обрабатывать данные или осуществлять резервное копирование) по расписанию или в ответ на события.
  • Интеграция с другими сервисами - самописный сервис может работать в связке с другими системными или сторонними сервисами, обеспечивая необходимую интеграцию и взаимодействие между ними.
  • Настройка и конфигурация - самописные сервисы позволяют гибко настраивать поведение системы, что может быть полезно для спецификации параметров, которых нет в стандартных сервисах.

На этом закончим с теорией и перейдем к решению конкретной задачи:

Написал я как-то простенького Telegram бота на python. По сути своей, это обыкновенный python скрипт, внутри которого крутится бесконечный цикл и не дает скрипту завершиться. Но сразу возникают проблемы:

  1. Скрипт запускается в терминальной сессии на сервере. Как только мы закрываем ssh подключение, скрипт падает.
  2. Скрипт использует переменные окружения терминальной сессии, а не самого сервера. Из-за этого могут возникать проблемы с доступами.
  3. Если скрипт аварийно завершается, его нужно перезапускать вручную.

Для создания бота нужно в папке /etc/systemd/system создать новый файл с расширением .service (например bot.service, где bot - имя демона, которое передается в systemd)

пример демона
пример демона
Description - Описание сервиса. Пишем что угодно.
After - Очередь запуска. Наш бот не может работать без сети, поэтому загружаем его после всех сетевых модулей.
Type - В основном, указывается simple.
User - От какого пользователя будет запущен демон.
ExecStart - Родительский скрипт вашего сервиса. Нужно прописывать полностью все параметры запуска.
Restart - Параметры перезапуска на случай падения нашего демона (always - моментальный перезапуск после падения)

После создания файла в папке systemd, демона необходимо запустить.

В нашем примере мы создали файл bot.service, соответственно, демона можно запустить командой:

systemctl start bot

Systemd перечитает это как:

systemctl start bot.service

Далее наш демон может быть использован так же, как и все остальные демоны в системе, т.е. для добавления его в автозапуск необходимо это указать командой 'systemctl enable bot', а посмотреть статус - 'systemctl status bot'

-2

Изменение конфигурационного файла systemd не подхватывается на лету, поэтому сервис необходимо будет перезапустить. Но при первом перезапуске выскочит ошибка:

Warning: bot.service changed on disk. Run 'systemctl daemon-reload' to reload units.

Вводим команду systemctl daemon-reload, чтобы systemd подтянул изменения