skrypt bash: powtórz polecenie, jeśli zwróci błąd


Odpowiedzi:


40

Podstawę tej eleganckiej pętli znalazłem gdzie indziej na serwerze serverault. Okazuje się, że nie ma potrzeby zapisywania kodu wyjścia, ponieważ można przetestować bezpośrednio na samym poleceniu;

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done

8

Prawie. Prawdopodobnie lepiej jest zapisać wartość zwracaną jako zmienną, aby można było ją wstępnie ustawić przed pętlą. W przeciwnym razie będzie to miało wpływ na polecenie ostatniego uruchomienia.

Możesz także zawiesić sleeptam, aby nie odradzał się zbyt szybko.

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done

Myślę, że zapomniałem przekazać kod wyjścia do zmiennej RET, ale mam pomysł. Moje główne pytanie dotyczy tego, kiedy zostanie oceniona klauzula till? W C nie będzie to oceniane aż do pierwszego uruchomienia pętli, w którym to przypadku moja pętla powinna działać. Twoje jest jednak jeszcze lepsze, ponieważ pozwala na wykonywanie poleceń pośrednich, takich jak sen. Dzięki!
Roy

Dobrze zauważony. Zredagowałem to. Klauzula zostanie oceniona przed pierwszym uruchomieniem. Wcześniej używałby kodu powrotu dowolnego poprzedniego polecenia. Podwójne równości nie są wymuszane przez Bash, ale jest to dobra praktyka w użyciu.
Dan Carley,

== jest równość strun nie numeryczne, chociaż nie sądzę, jest to ważne w tym przypadku ...
Kyle Brandt

Pojedyncze i podwójne są równe. Ale lepiej byłoby użyć równości liczb całkowitych teraz, kiedy o tym wspominasz.
Dan Carley,

1
Nie musisz testować numeru kodu powrotu - możesz po prostu przetestować kod powrotu samego programu - aż do programu; śpij 3; gotowy .
Chris

3

Trochę hacky, ale moim rozwiązaniem było po prostu utworzenie funkcji bash, która uruchomi się sama, jeśli zakończy się niepowodzeniem

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry

0

Możesz wykonać pętlę, gdy twoje polecenie zwróci błąd:

    while [ -n $(ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file) ]; do
            sleep 1;
    done;

3
Ta odpowiedź wymaga wyjaśnienia.
kasperd

Dodano wyjaśnienie @kasperd
Andrés Rivas,
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.