¿Qué hace kill 0 en realidad?

10

En el man page, dice:

          0      All processes in the current process group are signaled

Y lo intenté así:

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

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
¿Qué caparazón estás usando?
FatalError
@FatalError Estoy usando Bash
Firegun
Ver también el clon de Unix.SE de esta pregunta .
Adam Katz

Respuestas:

4

No pude encontrar una nota de cómo se kill 0comporta en mi página de kill man (debian).

Pero tengo dos comentarios:

(1) "Grupo de procesos" podría no ser lo que espera. Puede mostrar la ID del grupo de procesos (PGID) con 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

Entonces, manjunto con la herramienta de paginación de visualización ( less) está en el mismo grupo de proceso, pero eso es diferente de la del shell (zsh en mi caso).

(2) Probablemente hay dos killcomandos diferentes . Uno integrado en bash(ver bash (1), Sección "SHELL BUILTIN COMMANDS") y el externo /bin/kill. ¡Estos dos pueden comportarse de manera diferente! Puede indicar explícitamente cuál desea ejecutar escribiendo builtin killo en command killlugar de kill. El comando externo también puede ejecutar mediante la especificación de la ruta: /bin/kill.

mpy
fuente
1
PPIDes la ID del proceso principal , que a menudo es, pero no necesariamente, la ID del grupo de procesos. La columna correcta es PGID, que no aparece en la pssalida predeterminada ; necesita usar la -oopción para construir un formato personalizado que lo incluya.
chepner
@chepner: Tienes toda la razón, ¡gracias! Estaba confundido por mi página de manual ps (1) de Cygwin, que dice: "-l, --long: muestra los uids del proceso, ppids, pgids, winpids". Qué vergüenza, edité mi respuesta en consecuencia. Sin embargo, mi declaración (solo man + pager tiene el mismo PGID) es correcta ahora, según lo previsto. (Incluso antes de que esa frase fuera incorrecta :-()
mpy
1

Para detener todos sus procesos y cerrar sesión, ingrese:

kill -kill 0

Esto envía la señal 9, la señal SIGKILL, a todos los procesos que tienen una ID de grupo de proceso igual a la ID de grupo de proceso de los remitentes. Debido a que el shell no puede ignorar la señal SIGKILL, esto también detiene el shell de inicio de sesión y cierra la sesión

Este es el Manual de AIX de IBM, pero quizás se aplica el concepto.

Esta funcionalidad no existe en Linux "kill" (como puedo ver); pero así es como se comporta "matar":

Matar 0 no es matar al pid 0. En cambio, es una opción en kill para matar todos los procesos en el grupo actual . Con su comando, está eliminando todo en el ID de grupo de proceso (GID) del shell que emitió el comando kill.

Dane Balia
fuente