¿Qué hace kill 0 en realidad? [cerrado]

22

En el 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

Y lo intenté así en bash:

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

Aquí 0se usa como pid. Como entendí, kill 0matará todos los procesos en el proceso actual, que incluye pid15247. Sin embargo, no hizo nada en este ejemplo. ¿Alguien tiene ideas sobre cómo usarlo?

Arma de fuego
fuente
Envía un SIGTERMal proceso, lo que ha hecho. El mancomando ha elegido ignorarlo.
jordanm
55
@jordanm, no. un trabajo iniciado por un shell interactivo tiene un grupo de procesos diferente al del shell. Así es como el shell puede ponerlo en primer plano y en segundo plano. Ver ps -jpara ver los grupos de procesos.
Stéphane Chazelas
1
Esta pregunta es en realidad una copia de la pregunta SuperUser ¿ Qué hace kill 0 en realidad? (que se migró de StackOverflow). Ver también preguntas sobre kill -0(nota del guión), que es un tema diferente, en StackOverflow y aquí en Unix.SE .
Adam Katz

Respuestas:

27

Como dice, envía la señal a todos los miembros del grupo de proceso de la persona que llama.

Los grupos de procesos se utilizan para implementar el control de trabajos en el shell (se pueden usar para otras cosas, pero el control interactivo del trabajo del shell es la razón principal de su existencia).

Notarás que cuando escribes Ctrl-C, todos los procesos de los trabajos actuales se eliminan, no solo el que los inició. Además, eso no mata los trabajos en segundo plano.

Eso se logra con los grupos de procesos. Un trabajo es un grupo de procesos iniciados por un shell que el shell puede poner en segundo plano o en primer plano (establecido como el grupo de proceso en primer plano del terminal o no), y matar como un todo.

Puede averiguar sobre los identificadores de grupo de proceso y los identificadores de sesión con ps -j( jpara Jcontrol ob).

Para eliminar el grupo de proceso de PGID $x, debe hacer lo siguiente:

kill -- "-$x"

kill 0 mata al grupo de procesos de la persona que llama.

Tenga en cuenta que si lo hace: /bin/kill 0el shell iniciará un nuevo trabajo para ejecutar ese killcomando, por killlo que solo se suicidará.

killSin embargo, generalmente es un shell incorporado, por killlo que matará al grupo de procesos del shell.

Sin embargo, cuando el shell es interactivo, es el proceso que gestiona los grupos de procesos, por lo que normalmente no hay otro proceso en el grupo de procesos del shell. Todos los procesos iniciados por el shell están en otros grupos de procesos:

$ 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

Arriba, sleepy psestán en dos grupos de procesos diferentes, uno en segundo plano, uno en primer plano y son diferentes del grupo de proceso del shell.

Sin embargo, podrías hacer:

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

El shell interactivo comenzaría un nuevo grupo de procesos para ese subshell, y tanto el subshell como el man (y los otros comandos iniciados por man como su buscapersonas, groff ...) estarían en el mismo grupo de procesos, por kill 0lo que funcionaría allí. (lo sleepanterior es dar tiempo suficiente para que se inicie el buscapersonas para que podamos verlo en la ps -jsalida antes de matarlo).

Stéphane Chazelas
fuente
kill -- -$xen realidad dice bash: kill: (-63531) - No such processen bash 5.0.11 (1) -lanzamiento en MacOS 10.14 pero es seguro que el proceso existe y se está ejecutando. pkill -Pfunciona bien
kyb
1
@kyb $ x debe ser una identificación de grupo de proceso, no una identificación de proceso. Vea la salida de ps -jpara averiguar sobre pgids
Stéphane Chazelas