¿Se procesan varias entradas @daily crontab en orden, en serie?

22

Quiero que se ejecuten dos trabajos en algún momento todos los días, en serie, exactamente en el orden que especifique. ¿Este crontab hará de manera confiable lo que quiero?

@daily job1
@daily job2

Estoy asumiendo que se ejecutan uno tras otro, pero era incapaz de encontrar la respuesta mediante la búsqueda en la Web o de cualquiera de estas páginas de manual: cron(1), crontab(1), crontab(5).

El crontab anterior obviamente no hará lo que quiero si cron ejecuta cosas programadas @dailyen paralelo o en un orden impredecible.

Sé que simplemente puedo hacer un script de shell para activarlos en orden, solo tengo curiosidad por saber cómo se supone que funciona el cron (y soy demasiado vago para recopilar datos de prueba o leer el código fuente).

Cron es proporcionado por el cronpaquete. El sistema operativo es Ubuntu 10.04 LTS (servidor).

Adam Monsen
fuente
¿Sabes qué cron proporciona el cronpaquete? Casi todos los demonios cron que conozco manejarán esto en orden, y sincrónicamente, generalmente analizando primero cada archivo en orden alfabético (aunque algunos lo hacen por cantidad de tiempo entre ejecuciones en orden ascendente), y luego los trabajos dentro en orden de línea.
Chris Down
55
El hecho de que esté subespecificado generalmente significa que se deja a la implementación, y generalmente es mejor no depender de tal comportamiento. Probablemente sea más limpio y mejor organizado poner una secuencia de trabajos donde la secuencia importa en su propio script en lugar de como entradas de crontab separadas.
jw013
@ChrisDown: Vixie Cron, creo. packages.ubuntu.com/lucid/cron
Adam Monsen
1
Te sugiero que si realmente quieres ejecutarlos en orden, ejecuta uno un minuto después.
Kevin
@ jw013 y Kevin: de acuerdo, pero esa no es mi pregunta.
Adam Monsen

Respuestas:

26

Después de un rápido vistazo a la fuente (en Debian Squeeze, que creo que es la misma versión), parece entradas dentro de un archivo dado y con los mismos tiempos se ejecutan en orden. Para este propósito, @dailyy 0 0 * * *son idénticos (de hecho @dailyes idéntico a 0 0 * * *este cron).

No confiaría en esto en todos los ámbitos. Es posible que algún día alguien decida que cron debe ejecutar trabajos en paralelo, para aprovechar estas CPU de 32 núcleos que tienen 31 núcleos que funcionan inactivos. Esto se puede hacer al implementar este elemento de tareas de 20 años encontrado en la fuente cron:

Todos estos deben estar marcados y con carga limitada; es decir, en lugar de @hourly significa "0 * * * *" debería significar "cerca del frente de cada hora pero no hasta que la carga del sistema sea baja". (...) (vix, ene90)

Es muy fácil escribir @daily job1; job2aquí. Si es importante que los trabajos se ejecuten en orden, conviértalo en una consecuencia directa de lo que escribe.

Además, hacer que la orden sea explícita elimina el riesgo de que un futuro administrador reordene las líneas pensando que no importará.

Gilles 'SO- deja de ser malvado'
fuente
5

http://ss64.com/osx/crontab.html (así como otras referencias) dice que @daily es equivalente a

0 0 * * *

que dice correr a la medianoche. Esperaría que se lanzaran dos líneas de este tipo lo más cerca posible a la medianoche, sin garantía de cuál sería el primero. Estoy de acuerdo con la sugerencia de jw013 en su comentario:

El hecho de que esté subespecificado generalmente significa que se deja a la implementación, y generalmente es mejor no depender de tal comportamiento. Probablemente sea más limpio y mejor organizado poner una secuencia de trabajos donde la secuencia importa en su propio script en lugar de como entradas de crontab separadas.

Tom Barron
fuente
Esto ayuda, gracias. Estoy de acuerdo con que la sugerencia de @ jw013 es válida, pero esa no es la pregunta que hice. Supongo que tendré que consultar la fuente real para la respuesta definitiva, ya que esto es probablemente, de hecho, específico de la implementación.
Adam Monsen
0

@Giles comenta sobre el uso de un solo script cuando se importa para ejecutar las cosas en orden es apropiado.

cron.dailylos archivos no especifican tiempos de ejecución. Según mi experiencia, se ejecutan en serie. Esto tiene sentido ya que muchos trabajos en segundo plano pueden ejecutarse en una computadora portátil u otro sistema

Cuando se especifican los tiempos, se ejecutan todos los trabajos programados para el minuto actual. Es una buena idea usar diferentes tiempos.

Si tiene trabajos que son mutuamente excluyentes, es común usar un archivo de bloqueo para determinar si el otro trabajo se está ejecutando.

BillThor
fuente
@dailyes ligeramente diferente a /etc/cron.daily. La primera es una sintaxis alternativa para usar en un crontab. También eche un vistazo a run-parts. Mi sistema usa run-partspara ejecutar programas /etc/cron.daily. Según la página de run-parts(8)manual, "Los archivos se ejecutan en el orden de clasificación léxica de sus nombres ...".
Adam Monsen