"Kill <PID>" realmente no mata el proceso, ¿por qué?

118

Estoy tratando de mejorar mis habilidades en la línea de comandos y he encontrado un problema en el que no puedo matar un proceso. Escribo kill 2200donde 2200 es mi PID y el proceso no se elimina. Después de unos minutos, la espera todavía está en el topy ps aux. Incluso he intentado escribirlo con sudo, sin resultados.

¿Alguna idea de por qué sería así?


EDITAR

He encontrado una dependencia extraña, donde fgactualiza la lista de procesos:

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps
Patryk
fuente
¿Qué proceso fue ese? ¿Verificaste si el proceso tal vez no funcionó ? En ese caso, tendrías que matar el proceso padre.
htorque
El proceso es top(como se enumera en la edición). Solo quería intentar poner el programa en segundo plano y luego recuperarlo.
Patryk
2
Si suspende un proceso con CTRL-z, bloqueará la mayoría de las señales siempre que esté suspendido (es decir, hasta que realice un proceso fgo bgpara el proceso)
nos

Respuestas:

179

Los procesos pueden ignorar algunas señales. Si envía SIGKILL, no podrá ignorarlo (ni capturarlo para realizar limpiezas). Tratar:

kill -9 {PID}

Obtenga más información leyendo la página del manual:

man kill
Michał Šrajer
fuente
22
También tenga en cuenta que en algunas circunstancias muy específicas , un proceso puede estar en un estado zombie / difunto que incluso SIGKILL no puede matar el proceso. En ese caso, tendrá que encontrar el proceso principal y eliminar el proceso principal.
Lie Ryan
15
Si ese proceso se sale de la línea, entonces es KILL DASH NINE !
scottl
44
Y a veces no hay un proceso principal, en cuyo caso simplemente estás jodido. La única forma de eliminar dicho proceso es reiniciar la máquina.
user606723
2
El nombre del comando kill sigue siendo engañoso para muchos, muchos usuarios (incluido yo al principio). Se supone que cuando dices "matar X", esto significa realmente matar a la X y no hacer otra cosa. Entiendo que esto no va a cambiar nada, pero me gustaría que han elegido un nombre más elaborative ...
rbaleksandar
1
¿Qué hacer incluso después kill -9no funciona y el proceso sigue dando vueltas?
Douglas Gaskell el
42

Si killse invoca sin ningún parámetro, envía la señal número 15 ( SIGTERM). Esta señal puede ser ignorada por el proceso. Esta señal notifica el proceso para limpiar sus cosas y luego terminar correctamente solo. Esa es la buena manera.

También puede "enviar" la señal número 9 ( SIGKILL) que el proceso no puede ignorar. El proceso incluso no lo reconocerá, porque el núcleo finaliza el proceso, no el proceso en sí. Ese es el mal camino.

Uno dice que kill -9 <pid>siempre funciona. Eso es una incredulidad . Hay situaciones en las que incluso kill -9no mata el proceso. Por ejemplo, cuando un proceso tiene el estado D(suspensión ininterrumpida). Un proceso entra en este estado cada vez que espera E / S (normalmente no es muy largo). Entonces, si un proceso espera E / S (en un disco duro defectuoso, por ejemplo) y no está programado correctamente (con un tiempo de espera), entonces simplemente no puede matar el proceso . No importa lo que hagas. Solo puede intentar hacer que el archivo sea accesible para que el proceso continúe.

caos
fuente
2
Esto es muy útil, lo he experimentado varias veces debido al bloqueo del acceso de E / S en los discos de red y me preguntaba por qué no podía matar los procesos que se congelaron. ¿Hay más documentación sobre este tema específico y cómo solucionarlo?
Sheljohn
7

A pesar de que su nombre kill realmente no mata procesos, le envía señales. Desde la página del manual:

kill - send a signal to a process

La señal predeterminada enviada por kill [pid]es SIGTERM que generalmente pero no necesariamente le pide al proceso que finalice. Es bastante posible escribir un programa que reproduzca una melodía feliz cuando le envía la señal SIGTERM , pero no se recomienda.

Otra señal común es SIGHUP, que a menudo se usa para pedirle a un programa que vuelva a leer sus archivos de configuración.

Si realmente quieres matar un programa, debes usar la señal SIGKILL al hacerlo kill -9 [pid].

danne
fuente
2

Parece que podría estar suspendiendo un proceso (quizás presionando Ctrl-Z en el terminal). En este estado, su proceso no responderá a un SIGTERM ya que está congelado. Ejecutar 'fg' descongela el proceso, por lo que puede captar la señal y terminar automáticamente. Eso podría explicar por qué 'fg' parece actualizar la lista de procesos.

user24497
fuente
1
Entonces, ¿cómo encontrar el terminal conectado?
ruX
0

Desde C ++, ejecuté:

kill(4024, SIGKILL);

Y en un terminal de Linux (Ubuntu),

$ ps -ax | grep my_su

El resultado fue:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

Aparentemente, (4024) sigue sobreviviendo. Sin embargo, tan pronto como terminé el proceso padre que llamaba a la declaración "kill" anterior, 4024 ya no apareció. Ahora juzgo que el proceso "difunto" no es más que una línea visualizada y decidí ignorarlo. Espero que mi experiencia pueda ayudar a alguien por ahí. ¡Salud!

Park JongBum
fuente
0

También puede usar kill -lpara mostrar las señales admitidas por su arquitectura y obtener más información sobre la señal que desea usar para enviar una señal correctamente.

Nota: como otros pueden haber mencionado, el uso de kill -9 {PID}no se recomienda a menos que sea un proceso zombie. una vez que un proceso recibe un SIGKILL se apagará inmediatamente sin limpieza ni ningún otro procedimiento adecuado.

amrx
fuente
0

Esto es lo que solía usar en la tableta localhost que se ejecuta en el puerto 80 (por angular cli) Obtenga información de la aplicación en ejecución en el puerto 80

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

donde 3348está pid del proceso en ejecución

Aklesh Singh
fuente