Cosa fa effettivamente kill 0? [chiuso]


22

Nel man page, dice:

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

E ho provato così in bash:

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

Qui 0è usato come pid. Come ho capito, kill 0ucciderà tutti i processi nel processo corrente, che include pid15247. Tuttavia, in questo esempio non ha fatto nulla. Qualcuno ha idee su come usarlo?


Invia un SIGTERMal processo, che ha fatto. Il mancomando ha scelto di ignorarlo.
Jordan

5
@jordanm, no. un lavoro avviato da una shell interattiva ha un gruppo di processi diverso rispetto alla shell. Ecco come la shell può metterlo in primo piano e in background. Vedere ps -jper vedere i gruppi di processi.
Stéphane Chazelas,

1
Questa domanda è in realtà una copia della domanda di SuperUser Cosa fa realmente kill 0? (che è stato migrato da StackOverflow). Vedere anche domande circa kill -0(nota il trattino), che è un argomento diverso, a StackOverflow e qui su Unix.SE .
Adam Katz,

Risposte:


27

Come dice, invia il segnale a tutti i membri del gruppo di processi del chiamante.

I gruppi di processi vengono utilizzati per implementare il controllo dei processi nella shell (possono essere utilizzati per altre cose, ma il controllo interattivo dei processi della shell è la ragione principale della loro esistenza).

Noterai che quando digiti Ctrl-C, tutti i processi dei lavori correnti vengono eliminati, non solo quello che li ha avviati. Inoltre, ciò non uccide i processi in background.

Ciò si ottiene con i gruppi di processi. Un lavoro è un gruppo di processi avviati da una shell che la shell può mettere in background o in primo piano (impostata come gruppo di processi in primo piano del terminale o meno) e uccidere nel suo insieme.

È possibile scoprire gli ID dei gruppi di processo e gli ID di sessione con ps -j( jper il Jcontrollo ob).

Per eliminare il gruppo di processi di PGID $x, eseguire:

kill -- "-$x"

kill 0 uccide il gruppo di processi del chiamante.

Nota che se lo fai: /bin/kill 0la shell avvierà un nuovo lavoro per eseguire quel killcomando, quindi killsi ucciderà solo.

killdi solito è una shell incorporata, quindi killucciderà il gruppo di processi della shell.

Tuttavia, quando la shell è interattiva, è il processo che gestisce i gruppi di processi, quindi in genere non vi sono altri processi nel gruppo di processi della shell. Tutti i processi avviati dalla shell sono in altri gruppi di processi:

$ 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

Sopra, sleepe pssono in due diversi gruppi di processi, uno in background, uno in primo piano e sono diversi dal gruppo di processi della shell.

Puoi fare comunque:

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

La shell interattiva avvierebbe un nuovo gruppo di processi per quella subshell e sia la subshell che man (e gli altri comandi avviati da man come il tuo cercapersone, groff ...) sarebbero nello stesso gruppo di processi, quindi kill 0funzionerebbe lì. (quanto sleepsopra è di dare abbastanza tempo per l'avvio del cercapersone in modo che possiamo vederlo ps -jnell'output prima di ucciderlo).


kill -- -$xin realtà dice bash: kill: (-63531) - No such processin bash 5.0.11 (1)-release su MacOS 10.14 ma è sicuro che il processo esiste e in esecuzione. pkill -Pfunziona benissimo
Kyb

1
@kyb $ x deve essere un ID gruppo di processi e non un ID processo. Vedere l'output di ps -jper scoprire pgids
Stéphane Chazelas il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.