2012-02-21 12 views
7

Una necesidad muy común de una aplicación es ejecutar un script cada X minutos/horas. Básicamente no es nada complicado, solo algunos códigos PHP y una entrada crontab.Cronjob: ¿cómo hacerlo de la manera correcta?

Aunque he escrito algunos de esos cronjobs en los últimos años, todavía no he visto ninguna de las mejores prácticas, al menos no tanto. Al igual que con cada "procesamiento en segundo plano", muchas cosas pueden salir mal, especialmente en una configuración de producción.

Entre ellos:

  • Se produjo un error durante la ejecución del cron y el guión murieron el procesamiento de la mitad de los datos
  • la tarea programada fue accidentalmente inició dos veces por otro proceso/por error del usuario/lo que sea
  • la tarea programada tardó más tiempo del esperado y la secuencia de comandos se llama de nuevo aunque no es hacer el procesamiento de datos
  • etc.

¿Cuáles son algunas de las mejores prácticas para escribir scripts cronjob robustos y sólidos como una roca? ¿Escribir un archivo de bloqueo afirmando que solo se ejecuta una instancia, un registro extenso y monitoreo en el proceso para evitar el envío de diez mil correos electrónicos duplicados? ¿Cuáles son tus ideas?

+0

Es interesante que hayas publicado esto porque he estado investigando y preguntándome algunas de las mismas cosas. En mi caso, estoy realmente preocupado por cómo implementar efectivamente el manejo de excepciones en un script de shell que estoy escribiendo. http: // stackoverflow.com/questions/6961389/exception-handling-in-shell-scripting tiene buena información sobre eso en caso de que tenga curiosidad. Principalmente soy un desarrollador de Java y el manejo de excepciones allí es muy sólido, pero parece más difícil en la tierra * nix. –

+0

esto dependería de cada script que se ejecute, no hay respuestas genéricas, algunos necesitan una comprobación de errores muy robusta, algunos no necesitan ninguno ... –

+0

He marcado esta pregunta anticipando respuestas innovadoras con justificación detallada de sus beneficios y desventajas, y estoy bastante decepcionado con las respuestas "Esto es lo que hago". – nickb

Respuesta

2

Personalmente, la forma en que manejo los errores es simplemente enviar STDERR a un archivo de registro y luego revisar periódicamente ese archivo. Una forma fácil de hacerlo es agregar 2>/pathtolog a la entrada del crontab.

En cuanto a tener duplicados del mismo programa ejecutándose, prefiero que el script intente bloquear algo (un archivo o un puerto de red local). Si no puede obtener ese bloqueo, la secuencia de comandos no se ejecuta. De esta forma, si un script existente se está ejecutando actualmente, uno nuevo no puede obtener el mismo bloqueo.

0

Hay muchas cosas que puede hacer.

Establezca sus scripts/binarios de cron (scripts que supongo que ya mencionó que están escritos en PHP) para que los pueda ejecutar el propietario o el grupo según sus necesidades.

Si quiere asegurarse de que solo sean ejecutados por cron, cree un usuario cron que es el único usuario que puede ejecutar el script. Luego configure ese usuario para que lo ejecute en su entrada crontab.

En su script cron, produce cosas significativas que hace. Prefiera su salida con una marca de tiempo/fecha (según la frecuencia con que se ejecute). Esto hace que sea fácil grep para tiempos específicos en su archivo de registro.

Agregue el stdout de su script a un archivo de registro agregando >> /path/cron.log a su entrada de crontab.

También puede mostrar la hora de inicio y la hora de finalización de su cronjob para que pueda analizar el registro de vez en cuando para asegurarse de que no sea un proceso demasiado lento.

Su archivo de registro puede ser algo como:

[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Executing mycron.php 
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`"" 
[ Tue Feb 20, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 12324123) 
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Finished executing mycron.php. Time taken: 3.462 seconds 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Executing mycron.php 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`"" 
[ Tue Feb 21, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 10376123) 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Finished executing mycron.php. Time taken: 2.998 seconds 

Excepto haciendo todo lo que hace en vez de esos dos consultas al azar, por supuesto.

+0

cronjob para verificar el registro de tu otro cronjob, pero ¿y si ese falla? –

Cuestiones relacionadas