Crond compensó el horario de cinco minutos

22

¿Es posible compensar un script cron configurado para ejecutarse cada 5 minutos?

Tengo dos scripts, el script 1 recopila algunos datos de una base de datos y los inserta en otro, el script 2 extrae estos datos y muchos otros datos y crea algunos informes bonitos a partir de ellos. Ambos scripts deben ejecutarse cada 5 minutos. Quiero compensar el script 2 por un minuto para que pueda crear un informe a partir de los nuevos datos. Por ejemplo, quiero que se ejecute el script uno :00, :05, :10, :15 [...]y el script dos :01, :06, :11, :16 [...]cada hora. Los scripts no dependen unos de otros, y el script 2 debe ejecutarse independientemente de si el script uno fue exitoso o no. Pero sería útil si los informes pudieran tener los últimos datos. ¿Es esto posible con cron?

Enviar;
He pensado en usar ambos comandos en un script de shell para que se ejecuten inmediatamente uno después del otro, pero esto no funcionaría, a veces el script 1 puede quedar atrapado esperando API externas, etc., por lo que puede tardar hasta 15 minutos en ejecutarse, pero el script 2 debe ejecutarse cada 5 minutos, por lo que hacerlo de esta manera detendría / retrasaría la ejecución del script 2. Si pudiera configurar esto en Cron, significaría que el script 2 se ejecutaría independientemente de lo que estuviera haciendo el script 1

Mancha
fuente

Respuestas:

14

Puede ejecutar scripts cuando lo desee usar cron. Si desea ejecutar el script 1 cada 5 minutos, puede comenzar así:

*/5 * * * * /path/to/script1

Pero esto es realmente una abreviatura para:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

Si desea ejecutar el script 2 un minuto después del script 1, puede hacer esto:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

También puedes hacer esto:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

Y luego, al comienzo del script 2, duerme un minuto:

sleep 60
larsks
fuente
44
Poner la suspensión en el script en sí es un truco feo que hace que ejecutar el script a mano desde el prompt sea doloroso. Hay una manera menos fea de hackear eso haciendo que el sueño sea parte de la entrada crontab, pero una forma aún más elegante es simplemente compensar los trabajos usando la notación crontab correcta, que su respuesta no toca.
Caleb
39

El campo de entrada de minutos para crontab acepta un operador de "incrementos de" que es un poco confuso porque parece que debería ser un operador matemático de "división por" pero no lo es. La mayoría de las veces verá que usa algo como lo siguiente. Tenga en cuenta que esto no encuentra números que sean divisibles por cinco, sino que toma cada quinto elemento de un conjunto:

 */5 * * * * command

Esto le dice a cron que coincida con cada quinto elemento ( /5) del conjunto de minutos 0-59 ( *) pero puede cambiar el conjunto de esta manera:

 1-59/5 * * * * command

Esto tomaría cada quinto elemento del conjunto 1-59, ejecutando su comando en los minutos 6, 11, 16, etc.

Si necesita más compensaciones de grano fino que un minuto, puede hackearlo usando el comando sleep como parte de su crontab de esta manera:

 */5 * * * * sleep 15 && command

Esto ejecutaría su trabajo cada cinco minutos, pero el comando en realidad no comenzaría hasta 15 segundos después del minuto. Para trabajos de ejecución corta en los que estar unos segundos después de otra cosa marca la diferencia, pero no desea llegar un minuto tarde, este es un truco bastante simple.

Caleb
fuente
1
Esta es una mejor respuesta que la aceptada. Establecer el desplazamiento a través del rango es mucho más limpio que dormir.
ND Geek
11

Puede indicar un desplazamiento de tiempo con el símbolo +. Por ejemplo, para ejecutar en :01, :06, :11, :16 [...], cree una tarea como

*/5+1 * * * * command
Kurt
fuente
77
Esto no parece funcionar en algunas versiones de cron
jhoff
1
¿Qué versión de cron estás usando que sea compatible con esta sintaxis? Cronie no parece apoyarlo.
Matthew G
Tengo Cronie en CentOS7, así que no probaré esta solución primero.
AnneTheAgile
1

Esto funcionó para mí:

1/5 * ? * * *

Donde 1 son los minutos compensados. Entonces, si desea compensar tres minutos:

3/5 * ? * * *

Tengo esto trabajando en la configuración de programación de AWS

Zymotik
fuente