Czasami chcę szybko się wylogować kill -15 -1
. Zauważyłem, że bash ignoruje SIGTERM.
Zastanawiam się, jakie jest uzasadnienie takiego bashowego zachowania ?
Zignorowanie SIGTERM bez uzasadnionego powodu nie jest w UNIX-ie nieprawdaż, prawda?
AKTUALIZACJA:
taki sam (nie) efekt dla wszystkich:
$ kill -TERM $$
$ type kill
kill is a shell builtin
$ command kill -TERM $$
$ /bin/kill -TERM $$
AKTUALIZACJA 2:
From man bash :
Gdy bash jest interaktywny, przy braku pułapek, ignoruje SIGTERM
Więc jest to zrobione celowo. Ale dlaczego?
/bin/kill
czy wbudowana powłoka? Jeśli to drugie, domyślam się, że powłoka nie zabije się z własnym wbudowaniem.Odpowiedzi:
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:
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 nichset +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 tymkill 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
lubpkill -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
lublogout
), 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ępniekill -123 -456 …
zabić grupy procesów.źródło
To może odpowiedzieć na twoje pytanie:
ŹRÓDŁO : Podręcznik GNU Bash
źródło