Agregar un retraso aleatorio para un comando de Linux

13

Estoy usando func para realizar comandos paralelos en nuestros servidores.

El otro día, tuvimos un problema cuando un reinicio del servicio de puppetvía funchizo que todos nuestros servidores golpearan puppetmasteral mismo tiempo.

Mi pregunta: ¿Cómo puedo ejecutar el mismo comando exacto en un conjunto de servidores mientras agrego un retraso antes de que se ejecute en los servidores individuales?

P.ej: random_delay && service puppet restart

Estoy interesado en la random_delayparte del comando.

Belmin Fernandez
fuente

Respuestas:

25

sleep $((RANDOM % MAXWAIT)) donde MAXWAIT es el retraso máximo deseado en segundos.

S19N
fuente
Parece quedarse atascado en "1" mucho si haces eco de eso ... ¿Pensamientos?
Corey S.
Noté esto también. Pruebe esto, para x en 1 2 3 4 5; hacer ALEATORIO = $ x; i = $ ((ALEATORIO% 10)); echo $ i; dormir $ i; hecho Obviamente, MAXWAIT en la respuesta de S19N es similar en efecto a 10 en mi respuesta. Cambie la semilla ALEATORIA y, por supuesto, agregue el código de la marioneta a lo que desee.
dtbnguyen
2
@CoreyS. $ RANDOM está sembrando el último valor, de ahí el bucle (me he quedado atascado en 5/6/7, 2/7 y 5). sleep $((RANDOM % MAXWAIT))Es la forma correcta. Editaré la respuesta como tal.
Jeff Ferland el
Esto se llama splay en Pro Puppet. Se utiliza para evitar una manada atronadora , donde muchas máquinas están haciendo lo mismo al mismo tiempo. Además de esto, tuve éxito con la programación cron usando fqdn_rand.
François Beausoleil
Esto parece depender de extensiones específicas de bash. En dash echo sleep $((RANDOM % 900))devoluciones sleep 0. Esto significa que no es seguro usarlo en #!/bin/shscripts o lugares como crontab. (El problema parece ser que dashno comprende $RANDOM)
Gert van den Berg
1

Me gusta bastante la solución innovadora, pero menos que ideal de S19N. Solo digo que es menos que ideal, ya que todavía es en gran medida no determinista cuándo sucederán cosas realmente. Prefiero poder garantizar cuándo sucederán cosas y qué sucederá cuando suceda.

La orquestación de marionetas es en realidad un problema difícil .
Una de las soluciones de "mejores prácticas" es usar MCollective, que no solo le permitirá configurar cuando Puppet se ejecuta en su grupo de máquinas, sino que también puede usarlo para otros problemas de orquestación similares.

Tom O'Connor
fuente