Ajout d'un délai aléatoire pour une commande Linux

13

J'utilise func pour exécuter des commandes parallèles sur nos serveurs.

L'autre jour, nous avons eu un problème lorsqu'un redémarrage du service de puppetvia a funcfait que tous nos serveurs se sont abattus sur nous puppetmasteren même temps.

Ma question: comment puis-je exécuter la même commande exacte sur un ensemble de serveurs tout en ajoutant un délai avant son exécution sur les serveurs individuels?

Par exemple: random_delay && service puppet restart

Je m'intéresse à la random_delaypartie de la commande.

Belmin Fernandez
la source

Réponses:

25

sleep $((RANDOM % MAXWAIT)) où MAXWAIT est le délai maximum souhaité en secondes.

S19N
la source
Semble rester coincé sur "1" beaucoup si vous en faites écho ... Réflexions?
Corey S.
Je l'ai également remarqué. Essayez ceci, pour x dans 1 2 3 4 5; faire RANDOM = $ x; i = $ ((RANDOM% 10)); écho $ i; dormir $ i; done De toute évidence, MAXWAIT dans la réponse de S19N est similaire en effet à 10 dans ma réponse. Changez la graine RANDOM et ajoutez le code de marionnette à ce que vous désirez bien sûr.
dtbnguyen
2
@CoreyS. $ RANDOM sépare la dernière valeur, d'où le bouclage (je suis resté coincé le 5/6/7, 2/7 et 5). sleep $((RANDOM % MAXWAIT))est la bonne façon. Je vais modifier la réponse comme telle.
Jeff Ferland
Cela s'appelle splay dans Pro Puppet. Il est utilisé pour empêcher un troupeau tonitruant , où de nombreuses machines font la même chose simultanément. En plus de cela, j'ai réussi à utiliser l'ordonnancement cron fqdn_rand.
François Beausoleil
Cela semble dépendre des extensions spécifiques à bash. En dash echo sleep $((RANDOM % 900))retour sleep 0. Cela signifie qu'il n'est pas sûr de l'utiliser dans des #!/bin/shscripts ou des endroits comme crontab. (Le problème semble être qu'il dashne comprend pas $RANDOM)
Gert van den Berg
1

J'aime bien la solution innovante, mais pas idéale, du S19N. Je dis seulement que ce n'est pas idéal, car il est encore largement non déterministe quand des choses se produiront réellement. Je préférerais de beaucoup pouvoir garantir quand des choses arriveront, et quelles choses arriveront quand cela arrivera.

L'orchestration de marionnettes est en fait un problème difficile .
L'une des solutions les "meilleures pratiques" consiste à utiliser MCollective qui vous permettra non seulement de configurer le moment où la marionnette s'exécute sur votre cluster de machines, mais vous pouvez également l'utiliser pour d'autres problèmes d'orchestration similaires.

Tom O'Connor
la source