Chcę napisać logikę w skrypcie powłoki, który spróbuje uruchomić go ponownie po 15 sekundach do 5 razy w oparciu o „kod statusu = FAIL”, jeśli nie powiedzie się z powodu jakiegoś problemu.
shell-script
Sandeep Singh
źródło
źródło
break
że jeśli komenda się powiedzie, to przerwie to pętlęif command; then break; fi
a ściślejcommand && break
n
awarii niepotrzebnie śpi jeszcze jeden raz przed wyjściem.Zamień „polecenie” na swoje polecenie. Zakłada się, że „kod statusu = FAIL” oznacza dowolny niezerowy kod powrotu.
Wariacje:
Korzystanie ze
{..}
składni. Działa w większości powłok, ale nie BusyBoxsh
:Używanie
seq
i przekazywanie kodu wyjścia nieudanego polecenia:To samo co powyżej, ale pomijanie
sleep 15
po ostatecznym niepowodzeniu. Ponieważ lepiej jest zdefiniować maksymalną liczbę pętli tylko raz, osiąga się to poprzez uśpienie na początku pętli, jeślii > 1
:źródło
for i in 1 2 3 4 5
ją,for i in {1..5}
ponieważ jest łatwiejsza w utrzymaniu.&&
jest oceniana przed ze||
względu na pierwszeństwo operatoracommand
nie powiedzie.[[ i -eq 5]]
przed snem, aby tego uniknąć.Przykład:
tworzy ten wynik:
Aby zobaczyć prawdziwy przykład pracy ze złożonymi poleceniami, zobacz ten skrypt .
źródło
Oto funkcja ponownej próby
Wynik :
źródło
bash retry.sh 3 ping -c1 localhost
GNU Parallel ma
--retries
:źródło
Oto mój ulubiony alias / skrypt w jednym wierszu
Następnie możesz robić takie rzeczy jak:
i będzie uruchamiał poprzednie polecenie, aż znajdzie „Następny proces”
źródło
fc -e "#"
zamiastfc -s
.Używam tego skryptu, który wykonuje ponowną komendę, zaletą tego skryptu jest to, że jeśli nie powiedzie się wszystkie próby, zachowa kod wyjścia.
Prawdopodobnie może być łatwiej
źródło
Zobacz poniżej Przykład:
Usiłuję podłączyć port 3389 na localhost, będzie ponawiał próbę aż do 5 razy nie powiedzie się, jeśli sukces zakończy się przerwaniem pętli.
$?
istnieje status polecenia, jeśli zero oznacza, że polecenie zostało pomyślnie uruchomione, jeśli inne niż zero oznacza polecenie faiWydaje się to trochę skomplikowane, być może ktoś zrobi to lepiej niż to.
źródło
$?
to istnieje status polecenia jeśli zero oznacza pomyślnie uruchomić polecenie, jeśli inna niż zero oznacza komenda nieMożesz użyć
loop
polecenia dostępnego tutaj :Co zrobi twoje zadanie co 15 sekund, aż się powiedzie, maksymalnie pięć razy.
źródło
Oto
retry
funkcja rekurencyjna dla funkcjonalnych programistów purystów:Przekaż komendę (lub nazwę funkcji) i opcjonalnie liczbę ponownych prób oraz czas oczekiwania między kolejnymi próbami:
źródło