Biorąc pod uwagę tę pętlę:
while sleep 10s ; do
something-that-runs-forever
done
Kiedy naciskam Ctrl + C, cała pętla while zostaje przerwana. Chcę przerwać proces „coś”, odczekać 10 sekund, a następnie ponownie uruchomić „coś”.
Jak sprawić, by ctrl + c wpływał tylko na „coś”, a nie na pętlę while?
EDYCJA: „przerwij” jak w SIGINT. Zabić. Anulować. Zakończyć. Nie „przerywaj” jak w „pauzie”.
fg
? Po co w ogóle używać Ctrl + C?What I want to do is to interrupt the "something"-process, let 10 seconds pass, and then restart "something"
. Jeśli naciśniesz Ctrl + Z, odczekaj 10 sekund, a następnie uruchomfg
, dokładnie tak się stanie. Może mógłbyś edytować swoje pytanie i podać konkretny przykład, abyśmy mogli lepiej zrozumieć?Odpowiedzi:
Powinno to działać, jeśli po prostu
trap
SIGINT
do czegoś. Like:
(true
).Przerwanie
something...
nie powoduje teraz wyjścia powłoki, ponieważ ignoruje sygnał. Jednak jeśli ^ Csleep
proces, zakończy się niepowodzeniem, a pętla zatrzymuje się z tego powodu. Przesuńsleep
do wnętrza pętli lub dodaj coś takiego,|| true
aby temu zapobiec.Zauważ, że jeśli użyjesz
trap "" INT
do całkowitego zignorowania sygnału (zamiast przypisania do niego polecenia), zostanie on również zignorowany w procesie potomnym, więc też nie możesz przerwaćsomething...
. Jest to wyraźnie wspomniane w przynajmniej podręczniku Basha :źródło
do (trap - INT; something-that-runs-forever)
zezwolić na przerwanie polecenia. Ponadto, nie ma potrzeby uruchamiania:
- można po prostu użyć pusty ciąg zignorować sygnał:trap '' INT
. Wszystko to jest POSIX i powinno działać na dowolnej zgodnej powłoce (nie tylko Bash).SIGINT
w całości nie jest ściśle przenośny: „ Wdrożenia mogą zezwolić nazwy zSIG
przedrostkiem lub zignorować sprawę nazw sygnałów jak przedłużenie . (Podkreślenie moje)”trap "" INT
(także posix)trap :
zamiast tegotrap ""
było właśnie to, że nie zignorowałem sygnału (ale zamiast tego uczyniłem go brakiem operacji ), abyśmy nie musieli robić nic innego, aby móc przerwać głównysomething
program.Inną opcją jest
something-that-runs-forever
obsługa sygnału (wychodzenie z gracją po odebraniu). Oczywiście ma sens tylko wtedy, gdy ten program jest używany w wielu skryptach, a pożądane zachowanie na CTRL+ Cjest systematycznie takie samo - aby kontynuować wykonywanie skryptu.źródło