4 варианта Запуска скрипта на Python в Linux в фоновом режиме

Программируя в Python в определённый момент функциональности стандартной библиотеки становится недостаточно и приходится прибегать к установке сторонних пакетов-библиотек. В Python для этого используется менеджер установки пакетов pip (для Python3 соответственно pip3). Пока проект всего один, всё идёт хорошо, однако в какой-то момент оказывается, что в другом проекте нужен такой же пакет, как уже есть, только другой версии. Такое случается, когда библиотеки активно развиваются и в какой-то момент перестают поддерживать обратную совместимость. В таком случае, можно удалить текущую версию и поставить ту, в которой всё работает. Увы, такое случается довольно редко. В реальности скорее всего необходимо иметь две разных версии одного пакета одновременно.

Для решения конфликта версий был придуман механизм виртуальных окружений virtualenv (virtual environments). С его помощью можно создать виртуальную среду, в которую можно устанавливать пакеты независимо от основной среды или других виртуальных окружений. Для простоты можно считать, что venv создаёт внутри проекта каталог, в который добавляет нужную версию Python и устанавливает все используемые пакеты для приложения. В результате получается рабочее, изолированное и переносимое окружение.

Устанавливаем менеджер пакетов pip (если ещё не установлен). Чтобы иметь возможность устанавливать пакеты в Python, необходимо установить пакетный менеджер pip. Делается это с помощью следующей команды:

sudo apt install python3-pip

Устанавливаем пакет виртуального окружения virtualenv. С помощью только что установленного менеджера пакетов ставим пакет virtualenv:

# системно
apt install python3.10-venv
# для отдельного пользователя
sudo pip3 install virtualenv

Создаем окружение:

python3 -m venv venv

Запускаем окружение. Слева в приглашении командной строки появится (venv):

$ source venv/bin/activate
(venv) darkfire@dieg:~/project$

Далее устанавливаем зависимости, ниже пример листинга:

cat requirements.txt
aiogram==2.15
pandas==1.3.0
tabulate==0.8.9
pip install --upgrade pip
$ pip install -r requirements.txt

Напишем простой телеграм бот, который просто будет выводить кликабельную кнопку. Запускать бота будем от отдельного пользователя appuser.

import telebot
from telebot import types
bot = telebot.TeleBot("token")
 
@bot.message_handler(commands=['start'])
def url(message):
  markup = types.InlineKeyboardMarkup()
  btn1 = types.InlineKeyboardButton(text = "Hosting Consultant", url= "https://dieg.info/proverennye-hostingi-dlya-sayta/")
  markup.add(btn1)
  bot.send_message(message.from_user.id, "Click the button to go to the site", reply_markup = markup)
bot.polling(none_stop=True, interval = 0)

Зависимости бота в requirements.txt:

(venv) root@z:~/apppythonbot# cat requirements.txt
pyTelegramBotAPI==4.16.1

Ниже по листингу думаю все понятно. Создаем пользователя appuser, создаем папку с ботом, устанавливаем Python зависимости нашего бота для пользователя appuser.

useradd -m appuser
su - appuser
cd apppythonbot/
python3 -m venv venv
 
appuser@z:~/apppythonbot$ source venv/bin/activate
(venv) appuser@z:~/apppythonbot$ pip install -r requirements.txt

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

Расширенные настройки утилиты nohup описаны в статье: Использование nohup в Linux для запуска скриптов в фоновом режиме.

nohup python3 pythonbot.py &

Для простого запуска скрипта в фоне можно воспользоваться утилитой screen, которая позволяет создавать неограниченное количество сессий в терминале. Расширенные настройки утилиты screen описаны в статье: Использование Screen оконного менеджера для терминала.

apt install screen

Запустите новое окно командой screen и вводите команду стандартную команду запуска скрипта.

screen
python3 pythonbot.py &

Нажмите сочетание клавиш Ctrl + A + D — свернуть сессию. Screen будет отсоединен от экрана, вы вернетесь в физическую консоль. Сам screen при этом никуда не девается и висит в фоне, продолжая выполнять ваши задачи.

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

Создаем службу:

sudo nano /etc/systemd/system/new-application.service

Внутри этого файла вставляем:

Description=New Application
After=network.target
 
[Service]
User=myuser
Group=www-data
WorkingDirectory=/home/myuser/new-application
 
#Environment=VIRTUAL_ENV=/home/myuser/.virtualenvs/vlad
#Environment=PYTHONPATH=/home/myuser/SM_8ject/SM-8
Environment="PATH=/home/myuser/new-application/venv/bin"
ExecStart=/home/myuser/new-application/venv/bin/python bot.py --start
ExecStop=/home/myuser/new-application/venv/bin/python bot.py --stop
ExecReload=/home/myuser/new-application/venv/bin/python bot.py --restart
TimeoutSec=30
Restart=always

Команды для запуска, остановки, перезагрузки службы

sudo systemctl start new-application
sudo systemctl stop new-application
sudo systemctl start new-application
sudo systemctl reload new-application

Узнать статус работы:

sudo systemctl status new-application

Этот вариант предлагает использовать менеджер процессов PM2, специализированный инструмент для управления процессами Node.js, но также подходящий для запуска и мониторинга других типов процессов.

PM2 автоматически перезапускает бота и сохраняет логи. Установка PM2 описана в статье Установка, использование PM2 менеджера процессов для приложений Node.js. В самом простом случае для установки PM2 введите команды:

sudo apt install nodejs
sudo apt install npm

Теперь глобально устанавливаем сам диспетчер процессов:

npm install pm2 -g

Для запуска бота перейдите в директорию с ботом и запустите его командой:

pm2 start pythonbot.py --interpreter=python3

Всё, проверьте список запущенных приложений:

pm2 list

При разработке на Python в Linux для запуска скриптов в фоновом режиме доступны четыре основных варианта: использование nohup, программы screen, Systemd или менеджера процессов PM2. Каждый из них имеет свои особенности и преимущества, и выбор зависит от конкретных требований проекта и предпочтений разработчика.

Читайте также: Как Использовать Telegram API с Bash: Отправка Сообщений, Файлов, Фотографий.

PQ VPS сервера в 28+ странах.