¿Qué tan preciso es un demonio cron?

22

¿El programador de trabajos cron es realmente preciso?

Quiero decir, necesito un script para ejecutar todas las noches lo último posible, PERO antes de las 00:00 del día siguiente.

Lo ideal sería ejecutar un trabajo cron a las 23.59 (o 11:59 pm), pero ¿será el sistema realmente preciso? Ya que importa un segundo, ¿debo configurar el trabajo cron en 23:58 para dejarlo en algún momento?

Sebastian
fuente
13
¿Por qué tienes estos requisitos? Tengo la sensación de que habrá una mejor manera de hacer lo que realmente estás tratando de hacer, y también podrías preguntar sobre eso. (Tomará un poco más de esfuerzo que solo programar un trabajo cron, pero tal vez no mucho más.)
David Z
Solía ​​usar un viejo cron tonto con una precisión de 10 minutos.
joshudson
77
Su requerimiento no me parece muy confiable. ¿Qué hacer si su sistema tiene una carga alta alrededor de la medianoche? A menos que tenga un sistema RT, no puede garantizar nada.
Thomas Erker
Tenga en cuenta que incluso si logra adquirir un servidor que siempre está disponible y siempre puede completar su trabajo en menos de un segundo, todavía hay cosas que pueden salir mal. Por ejemplo, su reloj puede comenzar a moverse sin darse cuenta. Esto es realmente muy frágil y estoy de acuerdo con los comentarios anteriores de que el sistema necesita cambiar.
Chris Hayes

Respuestas:

24

Lo que cron puede garantizar es que su trabajo comenzará no antes de la hora especificada (sujeto a la precisión del reloj del sistema). Pero no hay forma de darle ninguna garantía sobre el tiempo de terminación del trabajo. Dependerá de muchos factores:

  • ¿Qué tan cargado está el sistema?
  • ¿Qué hace el trabajo?
  • Lentitud debido a problemas de hardware.
  • Lentitud debido a problemas de red (suponiendo que el trabajo depende de la red)

Mi recomendación es cambiar su diseño de tal manera que no se requiera un tiempo de finalización específico.

kasperd
fuente
1
Probablemente, la forma más fácil de hacer esto es hacer que el trabajo que se inicia a través de cron cree un archivo para indicar que se está ejecutando y que se elimina cada vez que el trabajo sale (con éxito o sin éxito), y luego el siguiente trabajo (suponiendo que ese sea el propósito) espere hasta que el archivo desaparezca antes de que haga algo.
un CVn
@ MichaelKjörling Debería usar un directorio, en lugar de un archivo, ya que buscar un archivo y luego crearlo no es atómico .
8bittree
1
@ 8bittree también puedes usar flock si está disponible.
user9517 es compatible con GoFundMonica el
1
@ MichaelKjörling Pero, ¿por qué molestarse con el caso tal vez correcto cuando el caso correcto también es más simple?
8bittree
44
@ 8bittree Si usa O_CREATe O_EXCLindicadores, será atómico siempre que el archivo esté en un sistema de archivos local.
kasperd
14

Supongo que esto depende de su demonio cron, pero la documentación y el estándar indican que si especifica minutos, el trabajo se ejecutará en el minuto especificado.

Ver:

Tenga en cuenta que su secuencia de comandos se iniciará cuando el reloj llegue a la hora correcta, pero finalizará algún tiempo después de eso.

Falcon Momot
fuente
Tengo un servidor virtual con muy poca carga y, sin embargo, un cron configurado para ejecutarse cada minuto comenzará a veces a 0s, 1s, 2s, a veces hasta 17s. Supongo que cron puede ser menos preciso en un servidor virtual, ya que otro proceso fuera de ese servidor puede afectar la disponibilidad de recursos como la CPU.
Liam
8

Por lo general, cron comenzará a las 23:59:00 , escaneará todos sus archivos crontab, filtrará los que sean relevantes para 23:59 y luego inícielos . Escanear estos archivos es muy rápido, porque no hay muchos y todos incluyen solo unas pocas líneas. Por lo general, los cronjobs comienzan a las 23:59:00 o 23:59:01 Hay formas seguras de ralentizar intencionalmente este proceso. (agregue millones de líneas al crontab, por ejemplo). Si el sistema está totalmente sobrecargado, esto tampoco funcionará tan rápido.

Además, esto obviamente depende de la implementación.

Si necesita tiempos de inicio muy exactos, es mejor que cree un programa que duerma hasta el momento que desee y luego se ejecute (por ejemplo, usando c ++ 11 ). Pero en un sistema operativo no en tiempo real, ¡esto tampoco será exacto! ¡Además, el reloj de la PC no sabe la hora exacta!

En todos los casos, esto solo asegura que el programa se inicie en (más o menos) el tiempo que desee. No puede haber ninguna garantía de que el programa finalice con éxito hasta un momento determinado, por lo que creo firmemente que debe cambiar algo en ese requisito.

Josef
fuente
2
Creo que los crontabs se guardan en la memoria: si edita los archivos detrás de crontab directamente (en lugar de crontab -e, que notifica a cron cuando se completa), los cambios no tendrán efecto. cron tiene montones de tiempo de inactividad para determinar qué trabajos están por venir, puede "dormir" hasta el momento exacto en que se debe ejecutar el trabajo.
AMADANON Inc.
0

Depende del tiempo total de ejecución del script y la precisión del tiempo del servidor.

59 23 * * * /some/script/file.sh

lanzará su script exactamente a las 23:59, pero, si tiene algunos comandos que funcionan mucho tiempo, parte del script puede ejecutarse después de la medianoche.

hombre extraño
fuente
exactamente a las 23:59 , ¿entonces puede ser de 23:59:00 a 23:59:59?
AL
2
No tienes segundos en cron normal. Para obtener esos 59 segundos adicionales, debe agregar una 'espera (59)' en la parte superior de su código.
El gato de Henry
44
@AL en la práctica, siempre he visto que se ejecuta en xx: xx: 00 o xx: xx: 01, pero en un sistema con mucha carga no hay ni puede haber ninguna promesa.
hobbs