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 2200
donde 2200 es mi PID y el proceso no se elimina. Después de unos minutos, la espera todavía está en el top
y 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 fg
actualiza 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
command-line
process
Patryk
fuente
fuente
top
(como se enumera en la edición). Solo quería intentar poner el programa en segundo plano y luego recuperarlo.fg
obg
para el proceso)Respuestas:
Los procesos pueden ignorar algunas señales. Si envía SIGKILL, no podrá ignorarlo (ni capturarlo para realizar limpiezas). Tratar:
Obtenga más información leyendo la página del manual:
fuente
kill -9
no funciona y el proceso sigue dando vueltas?Si
kill
se 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 inclusokill -9
no mata el proceso. Por ejemplo, cuando un proceso tiene el estadoD
(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.fuente
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]
.fuente
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.
fuente
Desde C ++, ejecuté:
Y en un terminal de Linux (Ubuntu),
El resultado fue:
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!
fuente
También puede usar
kill -l
para 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.fuente
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
donde
3348
está pid del proceso en ejecuciónfuente