Запускаем Python-скрипт в фоне: Полное руководство для Linux

Запускаем Python-скрипт в фоне: Полное руководство для Linux

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

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

Представьте, что ваш скрипт собирает метрики с серверов, обрабатывает очередь задач или слушает API-запросы. Оставлять его в активном терминале — рискованно: закрытие сессии, обрыв SSH-соединения или случайный Ctrl+C прервут работу. Фоновый режим обеспечивает стабильность и независимость от пользовательской сессии.

Важно: "Фоновый режим" в Linux — это не одно решение, а целый спектр инструментов, от простого амперсанда до полноценных системных служб. Выбор зависит от задачи.

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

1. Амперсанд (&) — самый простой способ

Добавьте символ & в конец команды:

python3 my_script.py &

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

2. Связка nohup и & — защита от обрыва

Команда nohup (no hang up) игнорирует сигнал SIGHUP, который отправляется процессам при закрытии терминала.

nohup python3 my_script.py > output.log 2>&1 &
  • > output.log — перенаправляет стандартный вывод (stdout) в файл.
  • 2>&1 — перенаправляет стандартный поток ошибок (stderr) туда же.
  • & — отправляет процесс в фон.

Теперь скрипт продолжит работу после выхода из системы. Проверить его можно через ps aux | grep python.

3. disown — "открепить" уже запущенный процесс

Запустили скрипт и забыли добавить nohup? Не беда:

  1. Запустите скрипт: python3 my_script.py
  2. Нажмите Ctrl+Z, чтобы приостановить его.
  3. Введите bg, чтобы возобновить выполнение в фоне.
  4. Введите disown -h %1 (где %1 — номер задания в оболочке).

Процесс больше не получит SIGHUP.

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

Screen и Tmux — виртуальные терминалы

Эти менеджеры терминалов создают сессии, которые живут независимо от вашего подключения.

# Установка tmux (если нет)
sudo apt install tmux  # для Debian/Ubuntu
# Создание новой сессии
tmux new -s mysession
# Запуск скрипта внутри сессии
python3 my_script.py
# Отсоединиться: Ctrl+B, затем D
# Вернуться: tmux attach -t mysession

Сессия будет работать, даже если вы отключитесь от сервера.

Systemd — создание профессиональной службы (демона)

Для скриптов, которые должны работать постоянно и стартовать при загрузке системы, идеально подходит systemd.

Создайте файл службы: /etc/systemd/system/my_python_script.service

[Unit]
Description=My Python Background Script
After=network.target

[Service]
Type=simple
User=username
WorkingDirectory=/path/to/script
ExecStart=/usr/bin/python3 /path/to/script/my_script.py
Restart=on-failure
RestartSec=10
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

Далее:

sudo systemctl daemon-reload
sudo systemctl start my_python_script
sudo systemctl enable my_python_script  # для автозапуска

Профессиональный совет: Для production-окружения всегда используйте systemd или аналогичные системы инициализации (supervisord). Это дает контроль над правами, логированием, перезапуском и ресурсами.

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

  • jobs -l — список фоновых заданий текущей оболочки.
  • ps aux | grep python — поиск всех процессов Python.
  • kill -9 PID — принудительное завершение процесса по его ID.
  • sudo systemctl status my_python_script — статус службы systemd.
  • tail -f output.log — просмотр логов в реальном времени.

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

Как увидеть вывод скрипта, запущенного через nohup?

Вывод по умолчанию записывается в файл nohup.out в текущей директории или в указанный вами файл (например, output.log). Используйте tail -f nohup.out для отслеживания.

Мой скрипт завис в фоне. Как его завершить?

Найдите его PID (идентификатор процесса) командой ps aux | grep my_script.py и завершите: kill PID. Если не помогает, используйте kill -9 PID.

Как сделать, чтобы скрипт перезапускался при сбое?

При использовании systemd укажите директиву Restart=on-failure в файле службы. Для простых сценариев можно обернуть запуск в bash-цикл, но systemd надежнее.

В чем разница между &, nohup и tmux?

& — просто фон в текущей сессии. nohup — защита от завершения при разрыве связи. tmux — полноценная виртуальная сессия, где можно взаимодействовать со скриптом (например, отправлять ему ввод).

Как перенаправить и логировать ошибки Python?

Используйте конструкцию 2>&1, как показано в примере с nohup. Все сообщения (и stdout, и stderr) попадут в один файл. Для раздельного логирования укажите разные файлы: 2> errors.log 1> output.log.