Po pierwsze, nie jest to specyficzne dla bash. ATT ksh, dash i zsh zachowują się w ten sam sposób: ignorują SIGTERM i SIGQUIT podczas edycji wiersza poleceń; co do mksh, to również nie wychodzi, ale traktuje je jak SIGINT.
Zarówno podręcznik ksh, jak i podręcznik bash uzasadniają ignorowanie SIGTERM w następujących terminach:
dzięki czemu kill 0
nie zabija interaktywnej powłoki
kill 0
zabija wszystkie procesy w grupie procesów , w której znajduje się powłoka¹. W skrócie, grupa procesów składa się ze wszystkich procesów działających na pierwszym planie na terminalu lub wszystkich procesów w tle lub zawieszonym zadaniu.
Mówiąc dokładniej, dzieje się tak w nowoczesnych powłokach z kontrolą zadań . W takich powłokach kill 0
nie byłoby to przydatne, ponieważ powłoka byłaby w swojej własnej grupie procesów. Starsze powłoki (lub współczesne po nich set +m
) nie tworzyły grup procesów dla poleceń w tle. Można więc użyć tego polecenia, kill 0
aby zabić wszystkie polecenia w tle bez wylogowania. ² W związku z tym kill 0
uzasadnienie wygląda jak stare, które nie jest już uzasadnione, ale zachowuje zgodność wsteczną.
Istnieją jednak inne podobne sytuacje, w których uodpornienie skorupy jest przydatne. Rozważ przypadek, w którym procesy blokują terminal i chcesz je zabić bez wylogowania. Wiele systemów ma takie narzędzie, pkill
które pozwala zabijać procesy uruchomione na terminalu. Możesz uruchomić pkill -t $TTY
lub pkill -QUIT -t $TTY
zabić wszystkie procesy uruchomione na bieżącym terminalu, z wyjątkiem powłoki, która ignoruje sygnał.
Powłoka zwykle znika albo, gdy użytkownik ją opuści (za pomocą polecenia typu exit
lub logout
), albo gdy jej terminal sygnalizuje koniec wejścia (użytkownik może to spowodować, naciskając Ctrl+ D) lub całkowicie znika. W tym ostatnim przypadku powłoka odbiera sygnał SIGHUP i tego nie ignoruje.
Zrobisz to na przykład w przypadku wylogowania z sesji X kill -15 -1
, ponieważ zabija emulator terminala, który powoduje, że powłoka odbiera SIGHUP. W rzeczywistości wystarczy zabić serwer X, ale to wymaga znalezienia jego identyfikatora procesu. Jeśli chcesz, aby to samo polecenie działało w sesji tekstowej, możesz użyć kill -15 -1; exit
. W każdym razie jest to dość niebezpieczne polecenie.
¹ Wydaje się, że nie jest to z reguły wspomniane w podręcznikach powłoki; jest to funkcja podstawowego wywołania systemowego. Jest to wyraźnie wymienione w specyfikacji POSIX .
² W tym jobs -l
celu biegnij, aby zobaczyć listę zadań z ich identyfikatorem grupy procesów, a następnie kill -123 -456 …
zabić grupy procesów.
/bin/kill
czy wbudowana powłoka? Jeśli to drugie, domyślam się, że powłoka nie zabije się z własnym wbudowaniem.