Co właściwie robi kill 0? [Zamknięte]

22

W man pagenapisane jest:

kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
 pid... Specify the list of processes that kill should signal.  Each pid can be one of five things:
          0      All processes in the current process group are signaled

Próbowałem tak w bash:

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

Tutaj 0jest używany jako pid. 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
Wysyła a SIGTERMdo procesu, który wykonał. manPolecenie wybrano je zignorować.
Jordan
5
@jordanm, no. zadanie rozpoczęte przez interaktywną powłokę ma inną grupę procesów niż powłoka. W ten sposób powłoka może umieścić ją na pierwszym planie i w tle. Zobacz, ps -jaby zobaczyć grupy procesów.
Stéphane Chazelas,
1
To pytanie jest w rzeczywistości kopią pytania SuperUser Co właściwie robi kill 0? (który został migrowany z StackOverflow). Zobacz także pytania o kill -0(uwaga na desce rozdzielczej), który jest inny temat, na StackOverflow i tutaj na Unix.SE .
Adam Katz

Odpowiedzi:

27

Jak mówi, wysyła sygnał do wszystkich członków grupy procesów dzwoniącego.

Grupy procesów służą do implementacji kontroli zadań w powłoce (można ich używać do innych celów, ale interaktywna kontrola zadań powłoki jest głównym powodem ich istnienia).

Zauważysz, że podczas pisania Ctrl-Cwszystkie procesy bieżących zadań są zabijane, nie tylko te, które je rozpoczęły. To również nie zabija zadań w tle.

Osiąga się to dzięki grupom procesów. Zadanie to grupa procesów uruchamianych przez powłokę, którą powłoka może umieścić w tle lub na pierwszym planie (ustawiona jako grupa procesów na pierwszym planie w terminalu lub nie) i zabić jako całość.

Możesz dowiedzieć się o identyfikatorach grup procesów i identyfikatorach sesji za pomocą ps -j( jdla Jkontroli ob).

Aby zabić grupę procesów PGID $x:

kill -- "-$x"

kill 0 zabija grupę procesów dzwoniącego.

Zauważ, że jeśli to zrobisz: /bin/kill 0powłoka rozpocznie nowe zadanie w celu wykonania tego killpolecenia, więc killtylko się zabije.

killjest zwykle wbudowaną powłoką, więc killzabije grupę procesów powłoki.

Jednak gdy powłoka jest interaktywna, jest to grupa procesów zarządzająca procesami, więc zazwyczaj nie ma innego procesu w grupie procesów powłoki. Wszystkie procesy uruchomione przez powłokę znajdują się w innych grupach procesów:

$ sleep 1000 &
[1] 22746
$ ps -j
  PID  PGID   SID TTY          TIME CMD
22735 22735 22735 pts/23   00:00:00 zsh
22746 22746 22735 pts/23   00:00:00 sleep
22749 22749 22735 pts/23   00:00:00 ps

Powyżej, sleepi psto w dwóch różnych grup procesów, po jednym w tle, po jednym na pierwszym planie i są one różne od grupy procesu powłoki.

Możesz zrobić:

(man kill & sleep 1; ps -j; kill 0)

Interaktywna powłoka uruchomiłaby nową grupę procesów dla tej podpowłoki, a zarówno podpowłoka, jak i man (oraz inne polecenia uruchomione przez man, takie jak pager, groff ...) byłyby w tej samej grupie procesów, więc kill 0działałyby tam. ( sleeppowyższe ma dać wystarczająco dużo czasu na uruchomienie pagera, abyśmy mogli zobaczyć go na ps -jwyjściu, zanim go zabijemy).

Stéphane Chazelas
źródło
kill -- -$xfaktycznie mówi bash: kill: (-63531) - No such processw wersji bash 5.0.11 (1) na MacOS 10.14, ale jest pewne, że proces istnieje i działa. pkill -Pdziała dobrze
Kyb
1
@kyb $ x musi być identyfikatorem grupy procesów, a nie identyfikatorem procesu. Zobacz wyniki, ps -jaby dowiedzieć się o pgids
Stéphane Chazelas