Ejecute múltiples trabajos cron donde un trabajo lleva mucho tiempo

16

Tengo la siguiente pregunta general sobre los trabajos cron.

Supongamos que tengo lo siguiente en mi crontab:

* 10 * * * * someScript.sh
* 11 * * * * someScript2.sh
30 11 */2 * * someScript3.sh  <-- Takes a long time let's say 36 hours.
* 12 * * * someScript4.sh

¿Es lo suficientemente inteligente como para ejecutar los trabajos restantes en los momentos adecuados? Por ejemplo, ¿el script largo no necesita terminar?

Además, ¿qué sucede si el script largo inicial todavía se está ejecutando y cron vuelve a llamarlo?

¡Gracias!

usuario1357015
fuente
A Cron no le importa cuánto duran los trabajos; ejecutará copias adicionales.
Jeff Schaller
Asegúrese de que sus preguntas estén formateadas correctamente.
Bram

Respuestas:

31

Cada trabajo cron se ejecuta independientemente de cualquier otro trabajo que haya especificado. Esto significa que su script de larga duración no impedirá que otros trabajos se ejecuten en el momento especificado.

Si alguno de sus scripts todavía se está ejecutando en su próximo intervalo cron programado, se ejecutará otra instancia concurrente de su script.

Esto puede tener consecuencias imprevistas dependiendo de lo que haga su script. Recomendaría leer el artículo de Wikipedia sobre bloqueo de archivos , específicamente la sección sobre archivos de bloqueo . Un archivo de bloqueo es un mecanismo simple para indicar que un recurso, en su caso el someScript3.shscript, está actualmente 'bloqueado' (es decir, en uso) y no debe ejecutarse nuevamente hasta que se elimine el archivo de bloqueo.

Consulte las respuestas a la siguiente pregunta para obtener detalles sobre cómo implementar un archivo de bloqueo en su secuencia de comandos:

pastel de alma
fuente
8

No estoy seguro de lo que quieres decir con tiempo apropiado. Cron comenzará a trabajar a la hora programada para hacerlo. No verifica otros trabajos programados ni otras instancias de un trabajo.

Entonces, cualquier trabajo válido que defina se iniciará en el momento definido. Cualquier trabajo que se ejecute por más tiempo que el intervalo definido se iniciará varias veces. Es responsabilidad de quien escribió el trabajo evitar que realmente se ejecute varias veces si es necesario. Por ejemplo, verificando un archivo de bloqueo o archivo PID o algo así.

Existen limitaciones obvias en la cantidad de procesos que pueden ejecutarse en paralelo, pero no son específicos de cron.

Bram
fuente
6

Además de otras respuestas, especialmente el enlace publicado por @soulcake: si programa un comando de ejecución larga con un intervalo demasiado corto, cron ejecutará felizmente el segundo antes de que se complete el primero (a menos que haya algún tipo de mutex implementado en el comando) .

Eso a menudo ralentiza aún más el comando original, lo que lleva a que se ejecute otra instancia antes de que se completen las anteriores, etc. O puede ser indeseable por otras razones.

La forma general de prevenir es condicionar la ejecución del comando con una protección que garantiza que un comando anterior no se esté ejecutando. Por ejemplo:

10 * * * * pgrep my_slow_command >/dev/null || /usr/local/bin/my_slow_command

Asegúrese de que pgrep coincida con el nombre del comando cuando se ejecuta, por ejemplo, los scripts de python tienen python como nombre del ejecutable, que probablemente no sea lo suficientemente específico y que también tenga que coincidir con el nombre del script de python.

10 * * * * pgrep -f my_script.py || /usr/local/bin/my_script.py

(pgrep sin la opción '-f' coincide con los nombres de script bash)

Si no puede usar pgrep por alguna razón:

10 * * * * ps ax | grep [m]y_command || /usr/local/bin/my_command

Los corchetes se usan para evitar coincidir con el comando grep.

Edheldil
fuente
0

Yo uso flock.

* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out
JohnMudd
fuente