Автоматизация мониторинга и рестарта: watchdog + subprocess

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

pythonsubprocesswatchdog

👁 В продакшн-скриптах часто встречаются фоновые задачи или воркеры, которые могут зависнуть из-за внешних API или багов. Если их не контролировать, процесс может висеть часами, блокируя очередь или ресурсы. Можно автоматизировать мониторинг и безопасный рестарт таких задач с помощью watchdog и subprocess.

📝 Автоматический перезапуск зависшей функции с тайм-аутом

import subprocess
import time

def run_task():
    # Здесь любая долгоживущая задача
    subprocess.run(["python3", "worker.py"], check=True, timeout=10)

while True:
    try:
        run_task()
    except subprocess.TimeoutExpired:
        print("Задача зависла, перезапуск...")
        continue
    except subprocess.CalledProcessError as e:
        print(f"Задача завершилась с ошибкой: {e}, перезапуск...")
        continue
    time.sleep(1)

📌 Как это работает:

  • subprocess.run с timeout гарантирует, что зависшие процессы будут автоматически завершены.
  • Исключения TimeoutExpired и CalledProcessError позволяют контролировать поведение и безопасно перезапустить задачу.
  • Такой подход удобен для автоматизации периодических воркеров, ETL-задач или фоновых процессов без использования внешнего менеджера задач.

❗️ В продакшн-автоматизации важно не просто запускать скрипты, а контролировать их выполнение. Такой метод защищает от зависаний и экономит ресурсы сервера, особенно при параллельных воркерах и критичных задачах.

tags: #python #автоматизация #разработка

🧭 @recura_tech 🌐 VK 🌐 MAX

Скриншот: фрагмент Python‑кода на тёмном фоне — пример использования subprocess.run с параметром timeout и логикой перезапуска, логотип RECURA внизу.
Пример кода: запуск worker.py через subprocess.run с timeout и обработкой ошибок.

Читайте так же