Synchronizuję kilka katalogów. Mam otwarty terminal bash i wykonuję coś takiego:
for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done
Jeśli jednak chcę zatrzymać wszystko, naciskam Control-C. To zatrzymuje rsync, ale potem przechodzi do następnego. W tym przypadku zdaję sobie sprawę z tego, co się wydarzyło, a następnie po prostu naciskaj klawisz Control-C jak szaleniec, aż wszystko znów zadziała.
Czy jest jakiś sposób, aby to naprawić. Chcę tego, jeśli mam taką pętlę, i naciśnij Control-C, aby powrócił do mojej powłoki bash.
Odpowiedzi:
Spowoduje to również wyjście z pętli, jeśli z jakiegoś powodu pojedyncze uruchomienie rsync zakończy się niepowodzeniem.
źródło
break 2
(lub zamień „2” na liczbę zagnieżdżonych pętli, które chcesz zakończyć).Aby rozwinąć odpowiedź Dennisa, kod może wyglądać następująco:
Dla działającego przykładu (który zdarza się obejmować rsync), sprawdź http://gist.github.com/279849 .
źródło
Możesz ustawić pułapkę dla Control-C.
wykona
command
naciśnięcie Control-C. Po prostu umieśćtrap
instrukcję gdzieś w skrypcie w miejscu, w którym chcesz, aby stała się skuteczna.źródło
Kiedy umieścisz ciąg poleceń w nawiasach, ciąg będzie działał jako pojedynczy proces, otrzyma SIGINT i zakończy działanie po naciśnięciu Ctrl- C:
Ale! W przypadku
rsync
polecenia pozwala na wiele źródeł, więc kod, który napisałeś, byłby lepiej napisany jako:źródło
Ctrl-Z
aby zawiesić skrypt;kill %%
Kredyty, wyjaśnienia i więcej szczegółów w tej odpowiedzi .
źródło
Zwykle umieszczam w mojej pętli inne polecenie, które można łatwo przerwać. Wymaga naciśnięcia dwóch klawiszy Ctrl-C.
To nie jest takie świetne rozwiązanie dla tego rsync, który prawdopodobnie chcesz szybko uruchomić. Ale działa dobrze w przypadku innych pętli, takich jak ta:
Ta pętla będzie za każdym razem ponownie sprawdzać adres example.com, co jest przydatne, jeśli obserwujesz zmianę DNS.
źródło