Mam następujący skrypt:
#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat # wait indefinitely
Kiedy wysyłam SIGHUP
(za pomocą kill -HUP pid
) nic się nie dzieje.
Jeśli nieznacznie zmienię skrypt:
#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT # add this
trap "echo HUP" SIGHUP
cat # wait indefinitely
... wtedy skrypt robi to echo HUP
dobrze, gdy wychodzi (kiedy naciskam Ctrl + C):
roger@roger-pc:~ $ ./hupper.sh
We are 6233
^CHUP
Co się dzieje? Jak mam wysłać sygnał (niekoniecznie musi być SIGHUP
) do tego skryptu?
cat
procesu. Wypróbuj oryginalny skrypt i naciśnij,Ctrl+D
abycat
zakończyć proces. Gdycat
proces jest na pierwszym planie,HUP
sygnał nie jest poddawany działaniu. Spróbuj ponownie zcat
zastąpionym przezread
(wbudowana powłoka).while true; do read; done
na końcu, w przeciwnym razie wpisanie tekstu spowoduje również zamknięcie i chcę, aby zostało zamknięte na Ctrl + C.Odpowiedzi:
Podręcznik Bash stwierdza:
Oznacza to, że pomimo odebrania sygnału
bash
po jego wysłaniu pułapka na SIGHUP zostanie wywołana dopiero pocat
zakończeniu.Jeśli takie zachowanie jest niepożądane, użyj
bash
wbudowanych funkcji (np.read
+printf
W pętli zamiastcat
) lub użyj zadań w tle (patrz odpowiedź Stéphane'a ).źródło
@xhienne wyjaśnił już, dlaczego , ale jeśli chcesz, aby sygnał zadziałał od razu (i nie wychodził ze skryptu), możesz zmienić kod na:
Mały taniec z deskryptorami plików polega na obejściu tego, że
bash
przekierowuje standardowe wejście/dev/null
na polecenia uruchamiane w tle.źródło