Запуск Python-скрипта в фоне на Linux: nohup, screen, systemd, PM2 и Gunicorn

0
68

Памятка по фоновому запуску Python-скриптов в Linux

  1. Убедитесь, что скрипт не содержит бесконечных циклов ввода/вывода без обработки.
  2. Используйте nohup для простого запуска без привязки к терминалу.
  3. Для длительных сессий применяйте screen или tmux.
  4. Для production-среды настройте systemd-сервис с автозапуском.
  5. Перенаправляйте stdout и stderr в отдельные файлы для отладки.
  6. Проверяйте права на выполнение скрипта (chmod +x).
  7. Используйте виртуальное окружение (virtualenv/venv) для изоляции зависимостей.
  8. Для веб-приложений на Flask/Django применяйте Gunicorn с systemd.
  9. Мониторьте процессы через htop или ps.
  10. Настройте уведомления о падении скрипта через cron или systemd.
  11. Для микросервисов рассмотрите Docker с политикой перезапуска always.
  12. Тестируйте скрипт в фоне на тестовом сервере перед деплоем.

Как настроить виртуальное окружение virtualenv для Python

Python venv: гайд по виртуальному окружению в - изображение номер один
Python venv: гайд по виртуальному окружению в — изображение номер один

sudo apt install python3-pip # системно apt install python3.10-venv # для отдельного пользователя sudo pip3 install virtualenv python3 -m venv venv $ source venv/bin/activate (venv) darkfire@dieg:~/project$ cat aiogram==2.15 pandas==1.3.0 tabulate==0.8.9 pip install —upgrade pip $ pip install -r

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

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

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

Запуск бота в фоновом режиме (4 варианта)

Запуск python скрипта в - изображение номер два
Запуск python скрипта в — изображение номер два

import telebot from telebot import types bot = («token») @bot.message_handler(commands=[‘start’]) def url(message): markup = () btn1 = (text = «Hosting Consultant», url= «/») (btn1) bot.send_message(message.from_user.id, «Click the button to go to the site», reply_markup = markup) (none_stop=True, interval = 0) (venv) root@z:~/apppythonbot# cat pyTelegramBotAPI==4.16.1 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

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

Автоматический запуск скриптов python в отдельном screen на linux #screen #cront - изображение номер три
Автоматический запуск скриптов python в отдельном screen на linux #screen #cront — изображение номер три

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

Вариант 1: Nohup

Using nohup to start - изображение номер четыре
Using nohup to start — изображение номер четыре

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

Вариант 2: screen

How to run - изображение номер пять
How to run — изображение номер пять

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

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

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

Вариант 3: Systemd

Running - изображение номер шесть
Running — изображение номер шесть

sudo nano /etc/systemd/system/ Description=New Application After= [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 —start ExecStop=/home/myuser/new-application/venv/bin/python —stop ExecReload=/home/myuser/new-application/venv/bin/python —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

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

Вариант 4: менеджер процессов PM2

How to run a python3 script with pm2 - изображение номер семь
How to run a python3 script with pm2 — изображение номер семь

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

ЧИТАТЬ ТАКЖЕ:  Получение текста сообщения в Telegram боте на Python: пошаговый гайд

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

Вариант 5: Gunicorn HTTP-сервер для Python

Deploying - изображение номер восемь
Deploying — изображение номер восемь

Как запустить сайт с помощью Gunicorn: Django, Flask. Рано или поздно вы приходите к тому, что надо запустить проект на сервере. Это руководство покажет как превратить любой Python-скрипт в сайт. Также будут примеры запуска проектов, сделанных на Django и Flask.

  • sudo systemctl restart gunicorn – применяется если изменились какие-либо файлы Что такое Django
  • sudo systemctl restart – применяются в том случае если изменились настройки Gunicorn

sudo systemctl restart gunicorn – применяется если изменились какие-либо файлы Что такое Django

sudo systemctl restart – применяются в том случае если изменились настройки Gunicorn

Из командной строки

Как запустить код на - изображение номер девять
Как запустить код на — изображение номер девять

Командная строка
(еще её называют консоль или терминал) — это программа, которая позволяет управлять компьютером через текстовые команды.

В каждой операционной системе по умолчанию установлены разные консоли, и текстовые команды могут отличаться. Ниже рассмотрим варианты запуска python-скриптов из консоли для Windows, Linux и MacOS.

Windows (cmd)

How - изображение номер десять
How — изображение номер десять

Cmd (command line interpreter) — интерпретатор командной строки в Windows. Это приложение будет расшифровывать и выполнять ваши текстовые команды (в том числе и команды на запуск python-скриптов).

2
Откройте консоль cmd: комбинация клавиш Windows+R, далее введите «cmd» и нажмите «Enter» (или через поиск по фразе «Командная строка»);

How to use - изображение номер одиннадцать
How to use — изображение номер одиннадцать

Чтобы запустить программу, нажмите «Enter». Ваша программа запущена 🎉.

💭 Чтобы каждый раз не набирать длинный путь до файла, перейдите в директорию со скриптом (команда cd) и используйте при запуске только название файла:

Linux (bash)

how to execute a python script in linux by just double clicking on the script - изображение номер двенадцать
how to execute a python script in linux by just double clicking on the script — изображение номер двенадцать

В разных дистрибутивах Linux используются разные командные интерпретаторы. Самые популярные — shell (Unix shell) и bash (Bourne again shell). В них мы будем писать команды для запуска python-файлов.

2
Откройте терминал: комбинация клавиш Ctrl+Alt+T (или через «Приложения» → «Терминал») [шаг для версии Linux с графическим интерфейсом];

Run - изображение номер тринадцать
Run — изображение номер тринадцать

☝️ В большинстве дистрибутивов Linux по умолчанию команда python запустит Python 2.x.x. После того как вы установите Python 3-й версии, он будет доступен через команду python3.

💭 Для удобства запуска можно сразу перейти в каталог со скриптом (команда cd) и использовать при запуске только название файла:

MacOS (bash)

Create - изображение номер четырнадцать
Create — изображение номер четырнадцать

В OS X по умолчанию используется командный интерпретатор bash. Процесс запуска python-скриптов такой же, как и в Linux.

☝️ Команда python запустит Python 2.x.x. (в MacOS он установлен по умолчанию). После установки Python 3-й версии используйте команду python3.

💭 Для удобства запуска перейти в каталог со скриптом (команда cd) и используйте для запуска только название файла:

Из IDE

Using - изображение номер пятнадцать
Using — изображение номер пятнадцать

IDE
(Integrated development environment) — интегрированная среда разработки. Простыми словами это программа, которая помогает программистам разрабатывать программный код.

  1. Предварительно установить интерпретатор;
  2. Подключить интерпретатор в IDE.

Ниже рассмотрим, как подключить интерпретатор Python к PyCharm, VSCode, Sublime Text и IDLE.

PyCharm

Урок 15 - изображение номер шестнадцать
Урок 15 — изображение номер шестнадцать

2
Установите PyCharm (на официальном сайте есть бесплатная версия Community Edition);

How to run python program in py - изображение номер семнадцать
How to run python program in py — изображение номер семнадцать

Способ #1 (для нового проекта): при создании нового проекта File → New Project PyCharm предложит:

  • Использовать виртуальное окружение (например pipenv) и указать интерпретатор;
  • Использовать интерпретатор без виртуального окружения.

Download - изображение номер восемнадцать
Download — изображение номер восемнадцать

Способ #2 (для существующего проекта): откройте проект в PyCharm и добавьте интерпретатор в настройках File → Settings → Project:<name> → Project Interpreter.

Как запускать код в программе - изображение номер девятнадцать
Как запускать код в программе — изображение номер девятнадцать

💭 Иногда PyСharm не видит интерпретатор, тогда его нужно добавить вручную. Для этого рядом со строкой выбора интерпретатора нажмите на «Add Interpreter» (или «шестеренку»). Откроется окно «Add Python Interpreter», в котором нужно указать путь до вашего интерпретатора Python.

Configurando o - изображение номер двадцать
Configurando o — изображение номер двадцать

💡 Чтобы узнать путь до python-интерпретатора, запустите в консоли python в интерактивном режиме (команда python3 или python) и выполните 2 команды:

Отобразится полный путь до интерпретатора python — скопируйте его и используйте для настройки PyCharm.

4
Создайте новый файл с расширением.py и запустите его через Run → Run… (или комбинацией клавиш Alt + Shift + F10);

Установка - изображение номер двадцать один
Установка — изображение номер двадцать один

Python-файл запущен 🎉. В панели слева снизу отобразится консоль с результатом выполнения программы.

Pycharm - изображение номер двадцать два
Pycharm — изображение номер двадцать два

💭 Для следующих запусков файла можете использовать кнопку «Play» в правом верхнем меню (или комбинацию клавиш Shift + F10).

Debugging in - изображение номер двадцать три
Debugging in — изображение номер двадцать три

python - изображение номер двадцать четыре
python — изображение номер двадцать четыре

Python in - изображение номер двадцать пять
Python in — изображение номер двадцать пять

VSCode (Visual Studio Code)

Remote - изображение номер двадцать шесть
Remote — изображение номер двадцать шесть

3
Установите расширение «Python» для VSCode. Для этого нужно перейти на вкладку «Extensions» (на панели слева) и найти расширение «Python».

ЧИТАТЬ ТАКЖЕ:  Как в Python обозначается операция нахождения остатка от деления

4
Укажите в VSCode путь до python-интерпретатора. Для этого откройте командную строку VSCode комбинацией Ctrl + Shift + P (или «Шестеренка слева снизу» → «Палитра команд…»).

МИНИ-КУРС - изображение номер двадцать семь
МИНИ-КУРС — изображение номер двадцать семь

Далее найдите пункт «Python: Выбор интерпретатора» и в открывшемся окне выберите нужный интерпретатор.

5
Создайте новый файл с расширением.py и запустите его, нажав на значок «Play» в правом верхнем углу;

Sublime Text

Sublime - изображение номер двадцать восемь
Sublime — изображение номер двадцать восемь

3
В меню «Tools» → «Build System» выберите «Python» в качестве системы сборки.

4
Создайте новый файл с расширением.py и запустите его через меню «Tools» → «Build» (или комбинацией клавиш Crtl + B);

Если в терминале не отображается вывод скрипта, запустите его через «Tools» → «Build With…» → Python.

💡 В Sublime Text можно создать свою систему сборки через меню «Tools» → «Build System» → «New Build System…».

После создания конфигурации его необходимо сохранить по предложенному пути. Для корректной работы, конфигурация должна называться <ваше_название>.sublime-build. (например: -build.), иначе она не отобразится в меню «Build Systems».

В виртуальном окружении

Виртуальное окружение venv в - изображение номер двадцать девять
Виртуальное окружение venv в — изображение номер двадцать девять

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

Venv

Python virtual environment setup - изображение номер тридцать
Python virtual environment setup — изображение номер тридцать

Venv
— это модуль для создания облегченных «виртуальных сред». Каждая такая среда будет иметь собственный независимый набор python-пакетов.

Модуль Venv входит в стандартную библиотеку Python, отдельно устанавливать его не нужно.

2
Откройте консоль (терминал) и перейдите в каталог с python-скриптом;

venv — название виртуального окружения. Если создание прошло успешно, появится новая директория venv.

  • venv\Scripts\ — для Windows;
  • source venv/bin/activate — для Linux и MacOS.

4
Теперь, когда виртуальное окружение активировано, можно использовать стандартную консольную команду для запуска:

Setup - изображение номер тридцать один
Setup — изображение номер тридцать один

Как настроить python в - изображение номер тридцать два
Как настроить python в — изображение номер тридцать два

Pipenv

Pipenv - изображение номер тридцать три
Pipenv — изображение номер тридцать три

После этого все команды будут выполняться в виртуальной среде. Для запуска используйте команду:

Способ #2 #2.
Cразу запускайте скрипты внутри virtualenv через pipenv run python:

💡 Если вы хотите, чтобы Pipenv создавал файлы виртуальной среды в текущем каталоге проекта, установите переменную среды export PIPENV_VENV_IN_PROJECT=1.

Для полного удаления файлов виртуального окружения Pipenv используйте команду:

How to - изображение номер тридцать четыре
How to — изображение номер тридцать четыре

С помощью Docker

how to run python programs in docker - изображение номер тридцать пять
how to run python programs in docker — изображение номер тридцать пять

-t — тег для Docker-образа. Если не указывать версию, по умолчанию она будет latest.

Выше мы рассмотрели простейший пример запуска python-скрипта в Docker-контейнере. Вот ссылки на более сложные варианты:

  • Запустить Python через Pipenv в Docker-контейнере;
  • Веб-приложение на Python (Flask, Redis) с использованием Docker Compose;
  • FastAPI в Docker-контейнере;
  • Django-приложение в Docker-контейнере.

Через онлайн-сервисы

How to run python script using service in linux - изображение номер тридцать шесть
How to run python script using service in linux — изображение номер тридцать шесть

Простой способ запустить скрипт без установки Python — использовать онлайн-сервисы (также их называют онлайн-компиляторы).

  1. Online-python;
  2. OnlineGDB;
  3. Trinket;
  4. Replit;
  5. Programiz.

2
Загрузите свой файл. Для этого нажмите на значок «Open File from Disk» в левом верхнем углу.

По двойному клику на значок файла

Данный способ работает в операционных системах с графическим интерфейсом. Подойдет тем, кто не хочет писать команды в консоли. Чтобы способ сработал, необходимо предварительно установить Python.

После создания файла с расширением.py, операционная система по умолчанию ассоциирует его с приложением Python. Чтобы запустить скрипт, кликните дважды по значку файла — запустится интерпретатор Python и выполнит ваш скрипт.

  1. Нажмите на значок файла правой кнопкой мыши;
  2. Выберите «Открыть с помощью» → «Python».

Чтобы изменить приложение по умолчанию для файлов с расширением.py (для Windows):

  1. Нажмите на значок файла правой кнопкой мыши;
  2. Выберите «Свойства» → «Приложение (Изменить…)» → «Python».

💡 При запуске скрипта данным способом, окно с результатами выполнения автоматически закроется. Чтобы избежать этого, напишите в конце своего кода input().

Часто задаваемые вопросы о фоновом запуске Python-скриптов в Linux

Вопрос: Как проверить, работает ли скрипт в фоне?
Ответ: Используйте команду ps aux | grep python или jobs -l для просмотра фоновых процессов.

Вопрос: Как остановить скрипт, запущенный через nohup?
Ответ: Найдите PID процесса через ps aux | grep script.py и выполните kill PID.

Вопрос: В чем разница между screen и tmux?
Ответ: Оба являются терминальными мультиплексорами, но tmux имеет более современный API и поддержку скриптов.

Вопрос: Как сделать так, чтобы скрипт запускался автоматически при старте системы?
Ответ: Используйте systemd-сервис, создав unit-файл в /etc/systemd/system/.

Вопрос: Можно ли запустить скрипт в фоне без nohup?
Ответ: Да, используйте оператор & в конце команды, но при закрытии терминала процесс завершится.

Вопрос: Как перенаправить вывод скрипта в файл при фоновом запуске?
Ответ: Добавьте > output.log 2>&1 перед & или в nohup.

Вопрос: Что делать, если скрипт падает с ошибкой в фоне?
Ответ: Проверьте логи (например, nohup.out) и настройте systemd для автоматического перезапуска.

Вопрос: Как запустить несколько экземпляров одного скрипта?
Ответ: Используйте screen или tmux для отдельных сессий, либо systemd с разными unit-файлами.

Вопрос: Нужно ли виртуальное окружение для фонового запуска?
Ответ: Да, это изолирует зависимости и предотвращает конфликты версий библиотек.

Вопрос: Как настроить автозапуск скрипта после сбоя?
Ответ: В systemd добавьте Restart=always в секцию [Service] unit-файла.