Dodanie losowego opóźnienia dla polecenia Linux

13

Używam func do wykonywania równoległych poleceń na naszych serwerach.

Pewnego dnia mieliśmy problem, gdy ponowne uruchomienie usługi puppetvia funcsprawiło, że wszystkie nasze serwery uderzyły w nas puppetmasterw tym samym czasie.

Moje pytanie: Jak mogę wykonać to samo dokładne polecenie na zestawie serwerów, dodając opóźnienie przed wykonaniem go na poszczególnych serwerach?

Na przykład: random_delay && service puppet restart

Interesuje mnie random_delayczęść polecenia.

Belmin Fernandez
źródło

Odpowiedzi:

25

sleep $((RANDOM % MAXWAIT)) gdzie MAXWAIT to maksymalne pożądane opóźnienie w sekundach.

S19N
źródło
Wygląda na to, że często utkniesz na „1”, jeśli powtórzysz to… Myśli?
Corey S.
Zauważyłem to również. Spróbuj tego, dla x w 1 2 3 4 5; wykonaj LOSOWO = $ x; i = $ ((LOSOWO% 10)); echo $ i; spać $ i; zrobione Oczywiście, MAXWAIT w odpowiedzi S19N jest podobny do 10 w mojej odpowiedzi. Zmień ziarno RANDOM i dodaj kod lalek do wszystkiego, czego chcesz oczywiście.
dtbnguyen
2
@CoreyS. $ RANDOM rozpoczyna ostatnią wartość, stąd zapętlenie (utknąłem na 5/6/7, 2/7 i 5). sleep $((RANDOM % MAXWAIT))jest właściwy sposób. Będę edytować odpowiedź jako taką.
Jeff Ferland
W Pro Puppet nazywa się to splay . Służy do zapobiegania piorunom , gdy wiele maszyn robi to samo jednocześnie. Oprócz tego odniosłem sukces przy użyciu planowania cron fqdn_rand.
François Beausoleil
Wydaje się, że zależy to od rozszerzeń specyficznych dla basha. W dash echo sleep $((RANDOM % 900))zamian sleep 0. Oznacza to, że nie jest bezpiecznie używać go w #!/bin/shskryptach lub miejscach takich jak crontab. (Wydaje się, że dashproblem polega na tym, że nie rozumie $RANDOM)
Gert van den Berg
1

Bardzo podoba mi się innowacyjne, ale mniej niż idealne rozwiązanie S19N. Mówię tylko, że jest mniej niż idealna, ponieważ wciąż w dużej mierze nie jest deterministyczna, kiedy rzeczy się naprawdę wydarzą. Wolałbym raczej zagwarantować, kiedy coś się wydarzy i co się stanie, kiedy to się stanie.

Orkiestracja lalek jest w rzeczywistości trudnym problemem.
Jednym z „najlepszych praktyk” jest użycie MCollective, który nie tylko pozwoli ci skonfigurować, kiedy kukiełka działa na klastrze maszyn, ale możesz także użyć go do innych podobnych problemów z aranżacją.

Tom O'Connor
źródło
0
0 */12 * * * root perl -e 'sleep int(rand(43200))' && service puppet restart

Będzie to spać losowo od 0 sekund do 12 godzin (43200 = 12 x 60 x 60) co 12 godzin

rubo77
źródło