¿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
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:
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: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:
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.
fuente
Puede indicar un desplazamiento de tiempo con el símbolo +. Por ejemplo, para ejecutar en
:01, :06, :11, :16 [...]
, cree una tarea comofuente
Esto funcionó para mí:
Donde 1 son los minutos compensados. Entonces, si desea compensar tres minutos:
Tengo esto trabajando en la configuración de programación de AWS
fuente