trap: trap [-lp] [[arg] sygnał ...] Przechwytywanie sygnałów i innych zdarzeń. Polecenie definiujące i włączające daną akcję w przypadku, kiedy powłoka otrzyma sygnał lub pod innymi warunkami. Gdy powłoka otrzyma podany SYGNAŁ (lub sygnały), odczytywane i uruchamiane jest polecenie podane jako argument ARG. W razie braku argumentu (i podaniu pojedynczego SYGNAŁU) lub gdy argumentem jest `-', każdemu z podanych sygnałów jest przywracane pierwotne zachowanie. Jeśli ARG jest pustym łańcuchem, każdy SYGNAŁ jest ignorowany przez powłokę i wywołane przez nią polecenia. Jeżeli jako SYGNAŁ podano EXIT (0), polecenie ARG jest uruchamiane przy opuszczaniu powłoki. Jeśli jako SYGNAŁ podano DEBUG, ARG jest uruchamiane po każdym poleceniu prostym. Jeśli jako SYGNAŁ podano RETURN, ARG jest uruchamiane przy każdym zakończeniu funkcji powłoki lub skryptu uruchamianego przez polecenia wbudowane . lub source. Jeśli jako SYGNAŁ podano ERR, ARG jest uruchamiane za każdym razem, kiedy niepowodzenie polecenia spowodowałoby zakończenie powłoki w przypadku włączenia opcji -e. Jeśli nie podano argumentów, trap wypisuje listę poleceń przypisanych do każdego sygnału. Opcje: -l wypisanie listy nazw sygnałów i ich numerów -p wypisanie poleceń trap powiązanych z każdym SYGNAŁEM Każdy podawany SYGNAŁ może być nazwą sygnału wg. <signal.h> lub numerem sygnału. Nazwy sygnałów są niewrażliwe na wielkość liter, a prefiks SIG jest opcjonalny. Sygnał do powłoki można wysłać poleceniem "kill -sygnał $$". Stan wyjściowy: Zwracana jest prawda, chyba że podano błędny SYGNAŁ lub błędną opcję.
Podpowiedź
Polecam równiez od razu zerknąć do manuala polecenia kill.
#!/bin/bash
trap 'echo "Jestem kuloodporny, strzelaj sobie ..."' SIGINT
trap 'echo "Teraz już nie jestem kulodporny, możesz mnie unicestwić"; trap - SIGINT' SIGHUP
while : ; do
echo "Moj PID to: $$ ; Naciśnij ^C (CTRL+C) aby wyjść"
sleep 5
done
Konsola #1 |
Konsola #2 |
---|---|
Uruchamiamy kod z powyższego przykładu i parę razy
wysłalismy do programu sygnał johny@ThinkPad:~$ bash trap.sh
Moj PID to: 10876 ; Naciśnij ^C (CTRL+C) aby wyjść
^C
Jestem kuloodporny, strzelaj sobie ...
Moj PID to: 10876 ; Naciśnij ^C (CTRL+C) aby wyjść
^C
Jestem kuloodporny, strzelaj sobie ...
Moj PID to: 10876 ; Naciśnij ^C (CTRL+C) aby wyjść
Moj PID to: 10876 ; Naciśnij ^C (CTRL+C) aby wyjść
Moj PID to: 10876 ; Naciśnij ^C (CTRL+C) aby wyjść
|
|
Wysyłamy do uruchomionego procesu sygnał johny@ThinkPad:~$ kill -SIGHUP 10876
|
|
Sygnał zostraje przechwycony i program przy kolejnym
sygnału Teraz już nie jestem kulodporny, możesz mnie unicestwić
Moj PID to: 10876 ; Naciśnij ^C (CTRL+C) aby wyjść
Moj PID to: 10876 ; Naciśnij ^C (CTRL+C) aby wyjść
^C
|
Pierwsze polecenie trap
powoduje, że program na wysłanie sygnału SIGINT
będzie reagował pierwszym komunikatem.
Następna linijka mówi, że wysyłając sygnał SIGHUP
skrypt również wypisze komunikat, ale też przypisze standardowe działanie dla sygnału SIGINT
.
Tak więc początkowo naciskając klawisze ^C
(CTRL + C) nie uda nam się zamknąć programu, ale wystarczy wysłać do procesu sygnał SIGHUP
, by było to możliwe.
Aby wysłać do dowolnego procesu w systemie jakiś sygnał używamy polecenia kill.
W naszym przypadku będzie to polecenie kill -SIGHUP PID
, gdzie PID
to numer identyfikacyjny naszego procesu.
Ostrzeżenie
Pisząc zamiast polecenia myślnik przypisujemy sygnałowi domyślną akcję (np. trap - SIGINT
).
Ostrzeżenie
KILL
(-9
) nie może być zablokowany!