matar a los programas -9 pero aún se mantienen

11

Traté de eliminar todos mis trabajos en segundo plano enviados anteriormente bajo KUbuntu por

kill -9 $(jobs -p)

Aunque este comando inmediatamente dio el mensaje como

[1] Mató a myjob1

[2] Mató a myjob2

Todavía puedo ver sus procesos colgados en la salida de la parte superior y los usos de la CPU y la memoria no cambian en la salida del tiempo de actividad y son gratuitos.

Así que supongo que no debo haberlos matado correctamente. ¿Puede alguien explicarme qué me está pasando y qué debo hacer?

Descubrí que en la parte superior, si escribo k e ingreso el PID, puedo eliminar los procesos uno por uno. Entonces, ¿esto es diferente del comando kill?

También encontré un sitio en línea http://www.ruhr.de/home/smallo/award.html sobre no recomendar kill -9

Uso inútil de Kill -9 forma carta

(Cita abominación)

No no no. No uses kill -9.

No le da al proceso la oportunidad de limpiar:

1) apague las conexiones del zócalo

2) limpiar archivos temporales

3) informar a sus hijos que se va a ir

4) restablecer sus características de terminal

Y así sucesivamente y así sucesivamente y así sucesivamente.

En general, envíe 15 y espere un segundo o dos, y si eso no funciona, envíe 2, y si eso no funciona, envíe 1. Si eso no funciona, ¡QUITE EL BINARIO porque el programa se comportó mal!

No uses kill -9. No saque la cosechadora solo para ordenar la maceta.

¿Es esto cierto? ¿Qué significa "enviar 15", "enviar 2" y "enviar 1"? ¿Son ellos mismos comandos o "kill -15 PID", "kill -2 PID" y "kill -1 PID"?

¡Gracias y saludos!

Tim
fuente
Eliminar el binario (archivo ejecutable) en sí mismo no matará el proceso. El sistema de archivos sabrá que el proceso está usando ese archivo y permitirá que el proceso "vea" el archivo incluso después de haberlo eliminado.
Jeppe Stig Nielsen

Respuestas:

9

Probablemente su proceso esté muerto, pero aún aparece en la entrada de la tabla de proceso porque es un "proceso zombie". Cuando un proceso hijo finalizó y desapareció por completo (excepto su entrada en la tabla de proceso) y el padre no pudo recuperar su estado de finalización (a través de ninguna de las funciones de espera), se llama zombie ... Matar (a través de la señal) un zombie no funciona porque ya está terminado. Lo que debe hacer es averiguar su proceso principal y matarlo a través de una limpieza, por lo tanto, no usar kill - 9

Aquí hay dos pasos simples para matar a un zombie ...

  1. si el padre todavía está vivo, intenta matarlo (o SIGHUP es todo lo que necesitas)
  2. Si el número 1 falla, hay un error en el núcleo ... reiniciar es tu amigo y corregir ese error: ->
nkr1pt
fuente
Presento mis trabajos en línea de comandos y en segundo plano, ¿cuáles serían sus padres? ¿Y cómo puedo encontrar a sus padres si los hay?
Tim
Use la -fbandera a ps para ver los procesos principales.
Jack M.
6

vea man killuna definición de las diversas señales disponibles, pero sí.

  • 15 es SIGTERM , y le pide a un programa que salga.
  • 2 es SIGINT y es equivalente a Control-C
  • 1 es SIGHUP e indica que el terminal ha colgado.

Estos informan a un proceso que el usuario ha "terminado" con el proceso, aunque indican razones algo diferentes. SIGTERM podría interpretarse como "finalizar la tarea actual, pero luego salir; no iniciar otro", SIGINT significa "abandonar lo que usted estás haciendo y renuncias ", SIGHUP simplemente significa que ya nadie está escuchando (un proceso de servidor podría reaccionar legítimamente a SIGHUP al descontinuar la salida de la consola y continuar ejecutándose).

  • 9 es SIGKILL , y es especial porque es el único que el proceso no puede atrapar y manejar internamente. Simplemente da como resultado que el núcleo nunca vuelva a controlar el proceso, lo que no le da la oportunidad de limpiar.
puetzk
fuente
en la parte superior, si escribo k e ingrese el PID, puedo eliminar los procesos uno por uno. Entonces, ¿esto es equivalente a algunas opciones para el comando kill?
Tim
Sí, top solo envía una señal al proceso, al igual que kill. AFAICT, la señal predeterminada que usa Top es 15 (SIGTERM).
puetzk 01 de
1

Significa usar kill -15 PID(u otro número) en lugar de kill -9 PID. Los números son equivalentes a diferentes señales de unix .

Adriano Varoli Piazza
fuente
1

Significa escribir "kill -1" o "kill -15" en lugar de escribir "kill -9". Kill -9 es una bala dura en la cabeza de cualquier proceso en ejecución, lo mata en un estado sucio que puede causar fugas de memoria, bla, bla.

Si está escribiendo kill -9 y no funciona, entonces me aseguraré de que el proceso no se reaparezca y que tenga permiso para matar ese proceso.

Satanicpuppy
fuente
¿Cómo se vería para asegurarse de que el proceso no se reaparece? Como soy el propietario de los procesos, ¿tengo permiso para eliminar ese proceso?
Tim
Debería tener un número de proceso diferente si es así. Entonces, si haces ps -Al y ves procesoA, entonces matas -9 procesoA, y luego haces ps -Al y TODAVÍA hay un procesoA en la cola del proceso, asegúrate de que sea el MISMO procesoA, y no uno nuevo.
Satanicpuppy
Y te dirá si no tienes permiso para matar el proceso.
Satanicpuppy
0

La señal 9 es SIGKILL. Enviar un SIGKILL es pedirle al sistema operativo que elimine el proceso inmediatamente, sin hacer preguntas. El proceso no se notifica por adelantado y no tiene la posibilidad de limpiarse después de sí mismo.

La señal 15 es SIGTERM. Enviar un SIGTERM es pedirle al sistema operativo que solicite que el proceso se cierre por sí solo.

SIGKILL puede ignorarse si el sistema operativo cree que el proceso está haciendo IO, o si se trata de un zombi (un proceso secundario cuyo padre no limpió después).

SIGTERM puede ser ignorado por la aplicación, pero no se recomienda que las aplicaciones hagan esto, ya que los sistemas operativos envían SIGTERM durante el apagado, seguido de SIGKILL en breve si todavía se está ejecutando un programa.

Nota: La línea de comando killsiempre le pide al sistema operativo que envíe una señal a la aplicación, lo que puede o no hacer según el propietario del proceso, etc.

Powerlord
fuente