Запуск Python-скриптов в фоновом режиме — фундаментальный навык для любого разработчика или системного администратора, работающего с Linux. Это позволяет выполнять длительные задачи без блокировки терминала, создавать демонов, обрабатывать данные в реальном времени и строить надежные автоматизированные системы. В этой статье мы разберем все методы — от простейших до профессиональных.
Почему фоновый режим так важен?
Представьте, что ваш скрипт собирает данные с API каждые 5 минут, обрабатывает очередь задач или слушает сетевой порт. Держать для этого открытым терминал неэффективно и ненадежно. Фоновый режим освобождает сессию, позволяет скрипту работать после закрытия терминала и является первым шагом к созданию полноценной службы.
Ключевое понятие: Демон (daemon) — это процесс, работающий в фоне, обычно без привязки к управляющему терминалу. Именно к этому статусу мы стремимся.
Базовые методы запуска
1. Амперсанд (&) — самый простой способ
Добавьте символ & в конец команды:
python3 ваш_скрипт.py &
Скрипт запустится в фоне, и вы сразу получите обратно управление терминалом. Однако у метода есть недостаток: если закрыть терминал, процесс, скорее всего, завершится (получит сигнал SIGHUP).
2. nohup — защита от обрыва связи
Команда nohup (no hang up) позволяет процессу игнорировать сигнал завершения при закрытии терминала:
nohup python3 ваш_скрипт.py &
Вывод скрипта по умолчанию сохраняется в файл nohup.out. Это уже надежнее, но процесс все еще не управляется как служба.
Продвинутые методы для production-среды
3. screen и tmux — виртуальные терминалы
Эти утилиты создают сессии, которые можно отключать и подключать заново:
tmux new -s mysession
python3 ваш_скрипт.py
# Нажмите Ctrl+B, затем D для отключения
# Вернуться: tmux attach -t mysession
Идеально для отладки, но для автоматического запуска при загрузке системы не подходит.
4. systemd — профессиональный подход
Создайте файл службы /etc/systemd/system/ваш-сервис.service:
[Unit]
Description=Мой Python сервис
After=network.target
[Service]
Type=simple
User=ваш_пользователь
WorkingDirectory=/путь/к/скрипту
ExecStart=/usr/bin/python3 /путь/к/скрипту/ваш_скрипт.py
Restart=always
[Install]
WantedBy=multi-user.target
Затем выполните:
sudo systemctl daemon-reload
sudo systemctl start ваш-сервис
sudo systemctl enable ваш-сервис # для автозапуска при загрузке
Совет: Для скриптов, работающих с графикой или требующих переменных окружения, используйте Type=exec или настройте Environment в секции [Service].
5. Менеджеры процессов (Supervisor, PM2)
Supervisor — популярное решение для управления процессами. Установите его и настройте конфиг:
[program:my_python_script]
command=python3 /путь/к/скрипту.py
directory=/путь/к/скрипту
autostart=true
autorestart=true
user=ваш_пользователь
Он предоставляет веб-интерфейс и удобные CLI-команды для мониторинга.
Мониторинг и управление фоновыми процессами
jobs— показывает фоновые задачи текущей сессииps aux | grep python— поиск всех Python-процессовkill -9 PID— принудительное завершение (используйте осторожно)systemctl status ваш-сервис— статус службы systemdtail -f nohup.out— просмотр вывода в реальном времени
Логирование — то, что часто забывают
Вместо вывода в stdout перенаправляйте логи в файлы:
nohup python3 script.py > /var/log/myapp.log 2>&1 &
Или используйте встроенный модуль Python logging с ротацией логов.
FAQ — Часто задаваемые вопросы
Как проверить, работает ли мой фоновый процесс?
Используйте ps aux | grep python или systemctl status имя-сервиса для systemd.
Мой скрипт завершается с ошибкой при запуске через systemd. В чем дело?
Чаще всего проблема в путях или переменных окружения. Проверьте абсолютные пути в ExecStart, укажите WorkingDirectory и установите необходимые переменные в секции [Service] через Environment.
Как автоматически перезапускать скрипт при сбое?
В systemd используйте директиву Restart=always или Restart=on-failure. В Supervisor — autorestart=true.
В чем разница между & и nohup?
& просто запускает процесс в фоне текущей сессии. nohup делает процесс невосприимчивым к сигналу SIGHUP (закрытие терминала), позволяя ему работать после разрыва соединения.
Какой метод выбрать для долгосрочного проекта?
Для серьезных проектов используйте systemd (если у вас systemd-дистрибутив) или Supervisor. Они обеспечивают надежный запуск, мониторинг, логирование и автозапуск при старте системы.