Ejecutar código cada hora [cerrado]

8

Necesito crear un servicio web que se ejecute cada hora. Se utilizará para revisar datos en una base de datos y agregar alertas a una tabla en la misma base de datos si se cumplen / no se cumplen ciertas condiciones. Lo que tenemos actualmente es:

Tenemos dispositivos finales que usan Python para informar a un servidor virtual de Amazon Web Services (AWS). El servidor de AWS toma esa información y la almacena en una base de datos MySQL. El servidor de AWS es Linux con Django y Apache. Necesito poder ejecutar algún código de Python cada hora que verifique los datos almacenados por los dispositivos finales. Si no se cumplen ciertas condiciones, se agregará un registro a la alertstabla en la base de datos.

Originalmente contratamos la creación de la configuración anterior. Soy nuevo en Python, Django y Apache. Sin embargo, ya he realizado varios cambios en el código de Python que envía y también recibe los datos de los dispositivos finales. Soy un programador que está entrando en la programación web.

¿Alguien tiene alguna recomendación sobre cómo puedo hacer esto?

Persistir
fuente
Use Quartz-Scheduler. Seguir el enlace será útil. quartz-scheduler.org Tutorial quartz-scheduler.org/documentation/quartz-2.1.x/quick-start
Quartz parece estar diseñado para Java. No estoy usando Java en absoluto. Estoy usando Python / Django.
Linger

Respuestas:

31

¿Qué tal hacer un trabajo temporal , suponiendo que tenga acceso de shell?

El demonio cron existe en prácticamente cualquier sistema similar a UNIX y programa comandos para que se ejecuten según una descripción en un archivo llamado crontab .

Cada línea del archivo contiene un conjunto de campos para indicar los puntos de tiempo cuando se ejecutará un comando.

Su tarea podría ser un programa independiente que realiza la tarea que desea realizar o, como sugiere otra respuesta, una invocación de un cliente HTTP como wget , curl o fetch para acceder a un recurso web que realizará la acción.

Si tiene límites para el tiempo que puede demorar una solicitud, es posible que deba mover la tarea a un script o programa fuera de línea que no se ejecute dentro de su servidor / marco web.

Lars Viklund
fuente
Cron definitivamente fue lo que terminé usando. Gracias por la respuesta. Para aquellos que no quieren trabajar con Cron pero quieren la misma funcionalidad, encontré dos servicios en línea que realizan trabajos como Cron: SetCronJob y Cronless .
Linger
17

Con Django en AWS, buscaría en Apio .

Celery agrega tareas asincrónicas e incluye un programador, y en AWS puede configurar Celery para usar el Servicio de cola simple de Amazon como el intermediario (consulte Celery con Amazon SQS en Stack Overflow y esta publicación de blog sobre el tema).

Configura un programa de tareas periódicas de Celery y ejecutará una tarea configurada de acuerdo con ese programa.

La ventaja es que puede usar toda la configuración para ejecutar cualquier tarea asincrónica, descargando tareas pesadas de su servidor web a los trabajadores de Celery.

La alternativa ligera es simplemente configurar un trabajo crontab; incluso podría configurar una ruta en su aplicación Django para que se llame usando curlo wget:

* 5 * * * curl http://username:password@hostname/route_to_job
Martijn Pieters
fuente
1
+1 Una solución mucho más refinada que mi simple crontarea, y específica para la implementación del OP.
msanford
7

Dado que su instancia de AWS ejecuta Linux, probablemente pueda lograr esto como un crontrabajo .

Podría tomar lo que yo llamaría el enfoque cron de Drupal que, en el caso de Django, implica crear un controlador para responder a una URL y luego realizar la acción que desee.

Luego configura una tarea cron a curlla URL del controlador, activando su script.

Esto tiene la ventaja adicional de ser fácilmente invocable en cualquier momento desde una URL: tal vez un administrador impaciente quiera un informe generado a partir de datos de los últimos 20 minutos.

msanford
fuente
3

Es posible que desee ver en APScheduler. Este es un planificador de cuarzo (aunque no tan extenso) para Python.

Esta puede ser una alternativa mucho mejor a los scripts cron ejecutados externamente para aplicaciones de larga ejecución (por ejemplo, aplicaciones web), ya que es neutral para la plataforma y puede acceder directamente a las variables y funciones de su aplicación.

Puede encontrar una descripción de la versión más reciente aquí: http://pypi.python.org/pypi/APScheduler/2.0.3

Aquí hay documentación para la instalación / implementación: https://apscheduler.readthedocs.org/en/latest/

Estas son algunas de las características:

  • Sin dependencias externas (duras)
  • API segura para subprocesos
  • Excelente cobertura de prueba (probado en CPython 2.5 - 2.7, 3.3, Jython 2.5.3, PyPy 1.9)
  • Mecanismos de programación configurables (disparadores):
    • Programación tipo crono
    • Programación retrasada de trabajos de ejecución única (como el comando "at" de UNIX)
    • Basado en intervalos (ejecutar un trabajo a intervalos de tiempo especificados)
  • Múltiples tiendas de trabajo simultáneamente activas:
    • RAM
    • Base de datos simple basada en archivos (estantería)
    • SQLAlchemy (cualquier RDBMS compatible funciona)
    • MongoDB
    • Redis
Anna
fuente
1

Creo que puedes usar algunas cosas como un django-extensions

Sitio web de Django-Extensions

Hay un módulo: trabajos. Para mí, esta es una muy buena herramienta para controlar sus cronjobs.

La segunda opción es usar un Fabric y crear una función para esto.

Y veo la tercera vía. Usa tu imaginación y conocimiento y crea tu propia función con subproceso y sh.

Demagógico
fuente
1

Lo más probable es que la respuesta aquí sea que esté ejecutando crontab con la configuración predeterminada, lo que significa que está mostrando crontab SPOOL RATHER QUE LOS ARCHIVOS.

Mientras tanto, se puede ejecutar también en AWS, ya que viene con cron preinstalado y configurado, que permite configurar una tarea que debe ejecutarse cada hora, diariamente, semanalmente o mensualmente, así como cualquier otro período de tiempo colocando archivos en un /etc/cron.xxxxxxdirectorio como se explica aquí .

Configurar un trabajo para que se ejecute cada hora, diariamente, semanalmente o mensualmente es muy rápido. Dado que la pregunta es cómo ejecutar el código cada hora, en AWS Linux puede crear un archivo /etc/cron.hourly.

Aquí está el paso cuando tiene Iniciar sesión en su instancia a través del cliente SSH.

$ echo "/usr/bin/python -q /path/to/your/file" > application
$ sudo mv application /etc/cron.hourly/
$ sudo chown -R root /etc/cron.hourly
$ sudo chmod 2755 /etc/cron.hourly/application
$ sudo /etc/init.d/crond restart

En el ejemplo anterior, el archivo guardado y denominado 'aplicación'. El nombre realmente no importa mientras sea único. Este es el informe de registro ejecutando:$ sudo vim /var/log/cron

Dec 28 19:01:01 ip-xxx-xx-xx-xx CROND[20243]: (root) CMD (run-parts /etc/cron.hourly)
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20261]: finished 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting application
Dec 28 19:01:02 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20323]: finished application

Como se muestra en el registro, cada hora comenzará a ejecutar un anacron que realiza la programación periódica de comandos que tradicionalmente realiza cron , y luego llama a todos los demás archivos en el directorio y ejecuta los comandos en cada archivo.

Chetabahana
fuente