Co właściwie robi kill 0?

10

W man pagenapisane jest:

          0      All processes in the current process group are signaled

Próbowałem tak:

$ man kill &
[1] 15247
$
[1]+  Stopped                 man kill
$ kill 0
$ ps
15247 pts/41   00:00:00 man

Jak zrozumiałem, kill 0zabije wszystkie procesy w bieżącym procesie, który obejmuje pid15247. Jednak w tym przykładzie nic nie zrobił. Czy ktoś ma pomysły, jak go używać?

Pistolet pożarowy
źródło
Jakiej powłoki używasz?
FatalError
@FatalError Używam Bash
Firegun
Zobacz także klon Unix.SE tej kwestii .
Adam Katz

Odpowiedzi:

4

Nie mogłem znaleźć notatki, jak się kill 0zachowuje na mojej stronie man kill (debian).

Ale mam dwa komentarze:

(1) „Grupa procesów” może nie być tym, czego oczekujesz. Możesz wyświetlić ID grupy procesów (PGID) za pomocą ps -o "%p %P %r %c %a":

$ ps -o "%p %P %r %c %a"
  PID  PPID  PGID COMMAND         COMMAND
12124 12123 12124 zsh             -zsh
12212 12124 12212 man             man kill
12226 12212 12212 less            less
12302 12124 12302 ps              ps -o %p %P %r %c %a

Tak więc, manrazem z narzędziem wyświetlającym pager ( less) znajduje się w tej samej grupie procesów, ale różni się od powłoki (w moim przypadku zsh).

(2) Prawdopodobnie istnieją dwa różne killpolecenia. Jeden wbudowany bash(patrz bash (1), sekcja „KOMENDY WBUDOWANE POWŁOKI”) i zewnętrzny /bin/kill. Ci dwaj mogą zachowywać się inaczej! Możesz wyraźnie określić, który chcesz uruchomić, wpisując builtin killlub command killzamiast niego kill. Polecenie zewnętrzne można również uruchomić poprzez podanie ścieżki: /bin/kill.

mpy
źródło
1
PPIDto identyfikator procesu nadrzędnego , który często jest, ale niekoniecznie, identyfikatorem grupy procesów. Prawidłowa kolumna to PGID, która nie pojawia się w domyślnym pswyjściu; musisz użyć -oopcji, aby utworzyć niestandardowy format, który go zawiera.
chepner
@chepner: Masz absolutną rację, dzięki! Byłem zdezorientowany przez stronę podręcznika ps (1) mojego Cygwina, która mówi: „-l, --long: pokaż identyfikatory procesu, ppids, pgids, winpids”. Wstydź się, odpowiednio zredagowałem swoją odpowiedź. Jednak moje stwierdzenie (tylko man + pager mają ten sam PGID) jest teraz prawidłowe, zgodnie z przeznaczeniem. (Zanim nawet to zdanie było błędne :-()
mpy
1

Aby zatrzymać wszystkie procesy i wylogować się, wprowadź:

kill -kill 0

To wysyła sygnał 9, sygnał SIGKILL, do wszystkich procesów mających identyfikator grupy procesów równy identyfikatorowi grupy procesów nadawców. Ponieważ powłoka nie może zignorować sygnału SIGKILL, zatrzymuje to również powłokę logowania i wylogowuje

To jest Podręcznik IBM AIX, ale być może ta koncepcja ma zastosowanie.

Ta funkcja nie istnieje w systemie Linux „kill” (jak widzę); ale tak zachowuje się „zabijanie”:

Zabicie 0 nie zabija pid 0. Zamiast tego jest opcja zabicia, aby zabić wszystkie procesy w bieżącej grupie . Za pomocą polecenia zabijasz wszystko w identyfikatorze grupy procesów (GID) powłoki, która wydała polecenie kill.

Dane Balia
źródło