# /home/x/rss/scheduler.py import time import logging import atexit from datetime import datetime, timedelta import sys # Added this import from apscheduler.schedulers.background import BackgroundScheduler # Importamos la app (para el contexto) y la función de captura desde nuestro fichero principal from app import app, fetch_and_store # Es importante configurar el logging también para este proceso logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='[%(asctime)s] %(levelname)s in %(module)s: %(message)s') # Creamos el planificador con la zona horaria UTC para evitar ambigüedades scheduler = BackgroundScheduler(daemon=True, timezone="UTC") # --- INICIO DE LA MEJORA: Apagado robusto con atexit --- def shutdown_scheduler(): """Función para detener el planificador de forma segura al salir.""" if scheduler.running: scheduler.shutdown() logging.info("Scheduler del worker detenido.") # Registramos la función de apagado para que se ejecute al terminar el proceso atexit.register(shutdown_scheduler) # --- FIN DE LA MEJORA --- if __name__ == '__main__': # Usamos el contexto de la aplicación para asegurar que la tarea tiene acceso a todo lo necesario with app.app_context(): # Añadimos la tarea para que se ejecute cada 15 minutos # La primera ejecución será a los 10 segundos de arrancar el worker scheduler.add_job( fetch_and_store, "interval", minutes=3, id="rss_job", next_run_time=datetime.utcnow() + timedelta(seconds=10) ) # Arrancamos el planificador scheduler.start() logging.info("Worker del Scheduler iniciado. Tarea programada cada 15 minutos.") logging.info("El proceso se mantendrá en ejecución para permitir que se ejecuten las tareas.") # Este bucle infinito simplemente mantiene vivo el script del worker. # El apagado ahora es manejado por atexit. while True: time.sleep(60)