Ну что же: демоны.
Демон в Linux — это специальный тип программы, который работает в фоновом режиме и выполняет определенные задачи, не требуя взаимодействия с пользователем. Демоны обычно запускаются при старте системы и продолжают работать до тех пор, пока система не будет отключена.
Маленькие фишки демонов:
- Фоновая работа - Демоны работают в фоне и не требуют активного вмешательства пользователя.
- Периодическая или непрерывная работа - Они могут выполнять задачи по расписанию (например, cron) или реагировать на события и запросы в реальном времени.
- Отсутствие привязки к терминалу - Демоны не привязаны к конечному терминалу, что позволяет им продолжать работу даже после выхода пользователя из системы.
Сколько бы споров в интернете ни велось, как бы ни поливали разными субстанциями systemd, именно systemd во всех современных дистрибутивах Linux управляет демонами.
Практически все системные и сетевые службы, которым необходимо работать постоянно, устанавливаются в систему как демоны (например, MySQL, Apache, Nginx, SSH, Iptables)
Так для чего же нам могут понадобиться самописные демоны:
- Автоматизация задач - вы можете создать сервис, который будет автоматически выполнять определенные задачи (например, запускать скрипты, обрабатывать данные или осуществлять резервное копирование) по расписанию или в ответ на события.
- Интеграция с другими сервисами - самописный сервис может работать в связке с другими системными или сторонними сервисами, обеспечивая необходимую интеграцию и взаимодействие между ними.
- Настройка и конфигурация - самописные сервисы позволяют гибко настраивать поведение системы, что может быть полезно для спецификации параметров, которых нет в стандартных сервисах.
На этом закончим с теорией и перейдем к решению конкретной задачи:
Написал я как-то простенького Telegram бота на python. По сути своей, это обыкновенный python скрипт, внутри которого крутится бесконечный цикл и не дает скрипту завершиться. Но сразу возникают проблемы:
- Скрипт запускается в терминальной сессии на сервере. Как только мы закрываем ssh подключение, скрипт падает.
- Скрипт использует переменные окружения терминальной сессии, а не самого сервера. Из-за этого могут возникать проблемы с доступами.
- Если скрипт аварийно завершается, его нужно перезапускать вручную.
Для создания бота нужно в папке /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'
Изменение конфигурационного файла systemd не подхватывается на лету, поэтому сервис необходимо будет перезапустить. Но при первом перезапуске выскочит ошибка:
Warning: bot.service changed on disk. Run 'systemctl daemon-reload' to reload units.
Вводим команду systemctl daemon-reload, чтобы systemd подтянул изменения