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.

Odpowiedzi:


25

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


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ą.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.