Mam polecenie, które chcę uruchamiać ponownie automatycznie za każdym razem, gdy się kończy, więc uruchomiłem coś takiego:
while [ 1 ]; do COMMAND; done;
ale jeśli nie mogę zatrzymać pętli, Ctrl-cto po prostu zabija, COMMAND
a nie całą pętlę.
Jak mam osiągnąć coś podobnego, ale co mogę zatrzymać bez konieczności zamykania terminalu?
Odpowiedzi:
Sprawdź status wyjścia polecenia. Jeśli polecenie zostało zakończone sygnałem, kodem wyjścia będzie 128 + numer sygnału. Z dokumentacji online GNU dla bash :
POSIX określa również, że wartość polecenia zakończonego sygnałem jest większa niż 128, ale wydaje się, że nie określa dokładnej wartości, jak GNU:
Na przykład, jeśli przerwiesz polecenie Ctrl, kodem wyjścia będzie 130, ponieważ SIGINT jest sygnałem 2 w systemach Unix. Więc:
źródło
paplay alert.ogg
, może dlatego, żepaplay
obsługuje sygnał?Możesz zatrzymać pracę i umieścić ją w tle, gdy jest uruchomiona, używając ctrl+ z. Następnie możesz zabić swoją pracę za pomocą:
Gdzie [1] jest twoim numerem pracy.
źródło
Powiedziałbym, że najlepiej umieścić swoją nieskończoną pętlę w skrypcie i obsługiwać tam sygnały. Oto podstawowy punkt wyjścia . Jestem pewien, że będziesz chciał go zmodyfikować, aby pasował. Skrypt używa
trap
do przechwytywania ctrl- c(lubSIGTERM
), zabija polecenie (użyłemsleep
tutaj jako testu) i kończy działanie.źródło
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
trap
podejście do tego samego skryptu (bash) z nieskończoną pętlą do zabicia, użyj$$
zamiast$!
(patrz tutaj )Generalnie po prostu przytrzymuję Ctrl-C. Wcześniej czy później zarejestruje się pomiędzy
COMMAND
i tym samym zakończywhile
pętlę. Może jest lepszy sposób.źródło
paplay
plik 1s.Jeśli uruchomisz z
-e
nim bash , wyjdzie on na dowolny błąd:źródło
Dlaczego nie po prostu
Lub gdy jest używany w skrypcie,
źródło
Wolę inne rozwiązanie:
Aby zabić pętlę, po prostu wykonaj:
źródło
while :
stworzy nieskończoną pętlę i zaoszczędzi ci pisania[ 1 ]
Spowoduje to wydrukowanie PID. Jeśli wyjdziesz z monitu przy użyciu,
ctrl+d
zadanie w tle nie zostanie zamknięte, a później możesz je zabić z dowolnego miejscakill PID
Jeśli zgubisz PID, możesz użyć
pstree -pa $USER
lub,pgrep -fl '.*PROCESS.*'
aby go znaleźćźródło
Użyj
trap
-źródło