Мастер фоновых процессов: Полное руководство по запуску Python-скриптов в Linux

Мастер фоновых процессов: Полное руководство по запуску Python-скриптов в Linux

Запуск Python-скриптов в фоновом режиме — это не просто технический трюк, а фундаментальный навык для любого разработчика или системного администратора, работающего с Linux. Эта возможность позволяет вашим программам работать автономно, не блокируя терминал, выполнять длительные задачи и создавать надежные сервисы. В этом руководстве мы разберем все методы — от простейших до профессиональных.

Почему фоновый режим так важен?

Представьте, что ваш скрипт собирает данные с API несколько часов, обрабатывает тысячи файлов или обслуживает веб-приложение. Держать терминал открытым всё это время непрактично. Фоновый режим освобождает ваш сеанс, позволяет скрипту пережить закрытие терминала и обеспечивает стабильную работу серверных приложений.

Базовые методы: &, nohup и disown

Символ амперсанда (&)

Самый простой способ — добавить & в конец команды:

python3 ваш_скрипт.py &

Скрипт запустится в фоне, но будет привязан к текущей сессии. Если вы закроете терминал, процесс, скорее всего, завершится.

Используйте jobs -l для просмотра фоновых задач текущей сессии, а fg %1 — чтобы вернуть задачу №1 на передний план.

Команда nohup

Чтобы процесс продолжал работу после выхода из системы:

nohup python3 ваш_скрипт.py &

Вывод скрипта по умолчанию сохраняется в файл nohup.out. Nohup игнорирует сигнал SIGHUP (hangup), который отправляется процессам при закрытии терминала.

Комбинация: Запуск, затем disown

  1. Запустите скрипт: python3 ваш_скрипт.py &
  2. Выполните disown или disown %1 (где 1 — номер задачи).

Теперь процесс «отвязан» от текущей сессии оболочки и продолжит работу после её закрытия.

Продвинутые инструменты: screen и tmux

Эти программы — «виртуальные терминалы», которые работают независимо от вашего основного сеанса.

  • Screen: Создайте сессию: screen -S mysession. Запустите скрипт. Нажмите Ctrl+A, затем D, чтобы отключиться. Вернуться: screen -r mysession.
  • Tmux: Более современная альтернатива. Запустите tmux new -s mysession. После запуска скрипта отключитесь комбинацией Ctrl+B, затем D. Вернуться: tmux attach -t mysession.

Screen и tmux идеальны для отладки длительных процессов, так как позволяют в любой момент вернуться и посмотреть живой вывод.

Профессиональный подход: systemd и менеджеры процессов

Создание службы systemd

Для создания полноценного системного сервиса создайте файл /etc/systemd/system/ваш-сервис.service:

[Unit]
Description=Мой Python сервис
After=network.target

[Service]
Type=simple
User=ваш_пользователь
ExecStart=/usr/bin/python3 /путь/к/скрипту.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

Затем выполните:

sudo systemctl daemon-reload
sudo systemctl start ваш-сервис
sudo systemctl enable ваш-сервис  # для автозапуска при загрузке

Менеджер процессов Supervisor

Установите Supervisor (sudo apt install supervisor). Создайте конфиг в /etc/supervisor/conf.d/:

[program:my_script]
command=python3 /путь/к/скрипту.py
directory=/путь/к/рабочей/директории
autostart=true
autorestart=true
user=ваш_пользователь

Обновите и запустите: sudo supervisorctl update.

Мониторинг и управление фоновыми процессами

  • ps aux | grep python — найти все Python-процессы.
  • htop или top — интерактивный мониторинг.
  • kill PID или pkill -f "имя_скрипта.py" — завершить процесс.
  • lsof -p PID — посмотреть, какие файлы открыты процессом.

FAQ: Часто задаваемые вопросы

Как увидеть вывод скрипта, работающего в фоне?

Если использовали nohup, смотрите файл nohup.out. Для systemd: sudo journalctl -u ваш-сервис -f. Для Supervisor: sudo supervisorctl tail my_script stdout.

Мой скрипт зависит от переменных окружения. Как их передать?

В systemd используйте директиву Environment="KEY=value" в секции [Service]. В Supervisor — environment=KEY="value",KEY2="value2".

Как гарантировать, что скрипт перезапустится при сбое?

Используйте Restart=on-failure в systemd или autorestart=true в Supervisor. Простые методы (&, nohup) такой возможности не дают.

Какой метод лучше для продакшена?

Для критически важных сервисов используйте systemd. Для управления группой процессов (например, воркеров очереди) отлично подходит Supervisor или аналоги (circus, gunicorn для веб-приложений).

Скрипт работает, но не пишет в логи. В чём проблема?

Убедитесь, что в коде используется принудительный сброс буфера вывода (sys.stdout.flush()) или запуск Python с флагом -u (unbuffered).