Как запустить бота в фоне (screen и systemd для чайников)
Дата публикации: 18.05.2026

Как запустить бота в фоне (screen и systemd для чайников)

Хочу себе такие же кнопки
ccb9a536

Что вы получите в конце урока

  • Поймёте, почему фоновые процессы нужны для ботов и как они работают.
  • Научитесь запускать бота в screen – простейший способ «запустить и забыть».
  • Овладеете systemd – современным менеджером сервисов, который будет автоматически перезапускать вашего бота после падения или перезагрузки сервера.
  • Получите готовый шаблон unit‑файла и проверенный набор команд, которые можно скопировать в любой VPS‑инстанс VDSina.

1. Почему нужен фоновой процесс?

Проблема Что происходит без фонового режима Как решаем
Сессия SSH закрывается Бот завершает работу, потому что процесс привязан к вашему терминалу. Запуск в screen или systemd.
Сервер перезагружается Бот не стартует автоматически, придётся вручную запускать его каждый раз. systemd‑ автозапуск и автоперезапуск.
Бот падает из‑за ошибки Процесс просто исчезает, и вы не знаете, что произошло. systemd‑ мониторинг и автоматический рестарт.

2. Запуск бота в screen

2.1 Что такое screen?

screen – это терминальный мультиплексор. Представьте, что ваш терминал – это телевизор, а screen – это переключатель каналов, позволяющий держать несколько «программ» (сессий) открытыми одновременно и возвращаться к любой из них в любой момент.

2.2 Установка screen

# На Debian/Ubuntu
sudo apt update && sudo apt install -y screen

# На CentOS/RHEL
sudo yum install -y screen

2.3 Создание и запуск сессии

# Создаём новую сессию с именем mybot
screen -S mybot

После этого вы окажетесь в обычном терминале, но уже внутри screen. Запускаете ваш бот, например:

python3 bot.py

2.4 Отсоединение от сессии

Нажмите Ctrl‑A, затем D. Вы увидите сообщение Detached from screen 'mybot'. Бот продолжит работать в фоне, а ваш терминал вернётся к обычному вводу.

2.5 Возвращение к сессии

screen -r mybot      # если только одна сессия
# или
screen -r <ID>       # если их несколько, ID берётся из `screen -ls`

2.6 Полезные команды screen

Команда Описание
screen -ls Список всех сессий.
screen -X -S mybot quit Принудительно завершить сессию.
Ctrl‑A K Убить текущий процесс внутри сессии.
Ctrl‑A ? Показать справку по комбинациям клавиш.

2.7 Как проверить, что бот живёт?

ps aux | grep bot.py

Если процесс найден, всё в порядке.


3. Запуск бота через systemd

3.1 Что такое systemd?

systemd – это «операционная система» внутри Linux, которая управляет сервисами (демонами). Он умеет:

  • Запускать сервисы при загрузке.
  • Автоматически перезапускать их после падения.
  • Записывать логи в journalctl.

3.2 Подготовка к работе

  1. Создайте отдельного пользователя для бота (по‑безопасности).

    sudo useradd -m -s /bin/bash botuser
    sudo passwd botuser
  2. Скопируйте ваш код в каталог /home/botuser/bot/.

    sudo mkdir -p /home/botuser/bot
    sudo chown -R botuser:botuser /home/botuser/bot
    # Предположим, что ваш бот – это файл bot.py
  3. Установите зависимости (если нужен virtualenv).

    sudo -u botuser bash -c "
    cd /home/botuser/bot
    python3 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
    "

3.3 Создание unit‑файла

Создайте файл /etc/systemd/system/bot.service:

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

Содержимое (скопируйте полностью, заменив пути под свои):

[Unit]
Description=My Telegram Bot
After=network.target

[Service]
Type=simple
User=botuser
WorkingDirectory=/home/botuser/bot
ExecStart=/home/botuser/bot/venv/bin/python3 /home/botuser/bot/bot.py
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target

Пояснения к ключевым параметрам

Параметр Что делает
User=botuser Запускает процесс от имени безопасного пользователя.
WorkingDirectory Папка, в которой будет работать бот.
ExecStart Полный путь к интерпретатору и скрипту.
Restart=on-failure Перезапускать только при ошибке (не при обычном kill).
RestartSec=5 Подождать 5 секунд перед рестартом, чтобы не «залипать».
StandardOutput=journal Перенаправлять вывод в системный журнал.

Сохраните файл и выйдите (Ctrl‑O, Enter, Ctrl‑X).

3.4 Перезагрузка конфигурации и запуск сервиса

sudo systemctl daemon-reload                # перечитать новые unit‑файлы
sudo systemctl enable bot.service           # добавить в автозапуск
sudo systemctl start bot.service            # запустить сейчас

3.5 Проверка статуса и логов

sudo systemctl status bot.service
sudo journalctl -u bot.service -f          # «‑» = следить в реальном времени

Если в логах вы видите Bot started (или ваш собственный вывод), всё работает.

3.6 Остановка, перезапуск, отключение

Команда Описание
sudo systemctl stop bot.service Остановить бот.
sudo systemctl restart bot.service Перезапустить (полезно после изменения кода).
sudo systemctl disable bot.service Убрать из автозапуска.
sudo systemctl enable bot.service Добавить в автозапуск.

3.7 Как обновить код без простоя

  1. Остановите сервис: sudo systemctl stop bot.service.
  2. Обновите файлы (git pull, копирование и т.п.).
  3. Запустите снова: sudo systemctl start bot.service.

Для «горячего» обновления можно использовать ExecReload в unit‑файле, но это уже продвинутый уровень.


4. Сравнение screen и systemd

Критерий screen systemd
Простота установки Да, один пакет. Уже установлен в современных дистрибутивах.
Автозапуск после перезагрузки Нет (нужен вручную screen -r). Да (enable).
Автоматический перезапуск при падении Нет (нужно писать скрипты). Да (Restart=on-failure).
Управление логами Через screen -L или отдельные файлы. Через journalctl.
Подходит для разработки Отлично – быстро «запустить‑запомнить». Лучше для продакшна.
Нагрузка на ресурсы Минимальная, но каждый screen – отдельный процесс. Минимальная, управляется ядром.

Вывод: используйте screen для коротких тестов и отладки, а systemd – для постоянных, надёжных сервисов.


5. Полезные лайфхаки

Лайфхак Как выполнить
Запуск сразу в фоне без screen nohup python3 bot.py > bot.log 2>&1 &
Ограничить потребление RAM Добавьте в unit‑файл MemoryLimit=200M.
Отправлять уведомления в Telegram при падении В ExecStartPost вызвать скрипт, который шлёт сообщение через Bot API.
Проверить, какие процессы запущены от имени botuser ps -u botuser -f
Сделать резервную копию unit‑файла sudo cp /etc/systemd/system/bot.service /root/bot.service.backup

6. Практика для закрепления

  1. Создайте screen‑сессию с именем testbot, запустите в ней простой скрипт while true; do echo $(date); sleep 2; done. Отсоединитесь, вернитесь и убедитесь, что вывод продолжает появляться.

  2. Сделайте unit‑файл для того же скрипта, используя шаблон выше. Проверьте, что после перезагрузки сервера скрипт стартует автоматически.

  3. Измените код бота (например, добавьте вывод print("Hello from bot") в начале). Перезапустите сервис с помощью systemctl restart. Убедитесь, что в журнале появился новый вывод.

  4. Настройте автоперезапуск: заставьте скрипт выйти с кодом 1 (например, exit 1). Посмотрите, как systemd автоматически перезапустит его, и сколько раз он попытается это сделать (параметр StartLimitBurst).

  5. Сравните ресурсы: запустите одновременно 5 экземпляров бота через screen и 5 через systemd. С помощью top или htop оцените, насколько отличаются потребления памяти и процессорного времени.


Важно: При работе с 🏰 VDSina не забывайте ставить в ссылки параметр ?partner=5095. Например, официальная страница документации по screen: https://vdsina.ru/docs/screen?partner=5095.

Удачной работы, и пусть ваш бот будет работать без перебоев! 🚀


Введение: чем VDS отличается от шаред-хостинга и зачем это веб-мастеру
Как правильно выбрать тариф: CPU, RAM, NVMe или SSD, канал
Выбор операционной системы: почему Ubuntu 22.04/24.04 — стандарт индустрии
Регистрация домена и первичная настройка DNS-записей (A, AAAA, CNAME)
Генерация SSH-ключей на локальном компьютере (Windows/Mac/Linux)
Добавление публичного ключа на сервер и первый вход по SSH
Отключение входа по паролю и запрет авторизации для root
Смена стандартного порта SSH для снижения шума в логах
Создание основного рабочего пользователя с правами sudo
Базовое обновление системы и установка необходимых утилит (curl, wget, git, htop)
Настройка часового пояса и синхронизация времени (NTP)
Установка и базовая настройка фаервола UFW
Разрешение только необходимых портов (SSH, HTTP, HTTPS)
Установка Fail2Ban для защиты от перебора паролей
Настройка правил Fail2Ban для SSH и веб-сервера
Знакомство с Docker: установка движка и CLI
Установка Docker Compose для управления мульти-контейнерными приложениями
Основы изоляции: почему каждый проект должен быть в своем контейнере
Подготовка файловой структуры сервера для удобного хранения проектов
Развертывание Nginx как обратного прокси-сервера через Docker
Настройка конфигурации Nginx для статических сайтов
Установка PHP-FPM в отдельном контейнере
Связка Nginx и PHP-FPM через внутреннюю Docker-сеть
Оптимизация настроек PHP-FPM (pm.max_children, memory_limit) под нагрузку
Установка MariaDB/MySQL в изолированном контейнере
Безопасное хранение паролей от БД через переменные окружения (.env)
Подключение к базе данных из внешнего клиента (DBeaver/Navicat) через туннель
Установка Redis для кэширования запросов и сессий
Интеграция Redis с PHP-приложением для ускорения работы
Автоматическая выдача SSL-сертификатов через Certbot (Let's Encrypt)
Настройка автопродления SSL-сертификатов по крону
Принудительный редирект с HTTP на HTTPS в Nginx
Включение gzip и brotli сжатия для ускорения загрузки страниц
Настройка кэширования статики (browser caching) в заголовках Nginx
Защита от простых DDoS и ботов: модуль limit_req в Nginx
Настройка резервного копирования баз данных (mysqldump) по расписанию
Настройка резервного копирования файлов проектов (tar)
Отправка бэкапов на удаленное хранилище (S3-compatible storage или другой сервер)
Ротация и очистка старых логов, чтобы не забить диск
Мониторинг нагрузки: установка и настройка htop и iotop
Просмотр логов в реальном времени: tail, grep и journalctl
Установка простого мониторинга доступности (Uptime Kuma или скрипт в Telegram)
Изоляция арбитражных инструментов: запуск ботов в отдельных контейнерах
Установка SOCKS5/HTTP прокси (3proxy) внутри Docker для мультиаккаунтинга
Настройка аутентификации и ограничения доступа к прокси по IP
Проверка анонимности и работы прокси-сервера
Оптимизация ядра Linux (sysctl.conf) для высоких нагрузок и сетевых соединений
Настройка swap-файла: когда он нужен, а когда вредит
Чек-лист финальной проверки безопасности перед запуском проекта
План действий при взломе или падении сервера: восстановление из бэкапа
АПТЕЧКА ДЛЯ ЖИВОТНЫХ
Автомобили Германии — FORD, MERSEDES, VW, IVECO
Чат рулетка 2026: чаты, где каждый момент — шанс
Чат рулетка онлайн
Чат с Аней: психологический разговор
Чатрулетка: новый способ общения
Чай и кофе: сила вкуса
Детские игрушки из безопасных материалов
Эксплуатация шин: Рекомендации по использованию
Фототехника для пейзажей
Как Aptum хостинг помогает малым бизнесам в управлении CRM-системами
Как выбрать Vdsina вечный хостинг для своего проекта
Компоненты безопасности IP
Конкуренция на российском автомобильном рынке
Онлайн генератор паролей для Windows
Оптимизация обработки форм GEO проекта
Сервер для социальных сетей: Безопасность, Скорость, Изоляция
Смешные моменты
Сравнение Arsys хостинг сервисов для блогеров с WordPress на 2023 год
Весь экран под циферблат
рейтинг хостингов 2026 Быстрые VDS серверы