Encontré un proceso zombi imposible de matar.




1. Conoce el proceso zombie


1. ¿Cómo surgió el proceso zombi?

Cuando se está ejecutando un proceso, se generarán un proceso padre y algunos procesos secundarios;
cuando se ejecuta el proceso secundario, enviará una señal de salida y luego morirá, y luego su proceso principal llamará (wait / waitpid) para leer su salida status,
si la lectura es exitosa, el proceso hijo se elimina de la tabla de procesos; de lo
contrario , no se puede eliminar de la tabla de procesos, entonces se convierte en un proceso zombie.

Cuando usa el comando ps para observar el estado del proceso, puede ver que el estado de estos procesos está inactivo.
ps aux | grep Z


2. ¿Es perjudicial el proceso zombi?

Si la cantidad de procesos zombies es enorme y existe durante mucho tiempo, equivale a una gran cantidad de información de procesos zombies que queda en la tabla de procesos,
y esta información debe almacenarse en la memoria, por lo que desperdiciará recursos.




En segundo lugar, el método de matar convencional del proceso zombi.


1. Elimina el pid del proceso padre -9

Dado que el proceso zombie ha muerto (solo se conserva la estructura task_struct), y el proceso muerto no se puede
eliminar directamente, el proceso zombie generalmente se elimina indirectamente al eliminar el proceso padre.

Elimine el proceso principal, el proceso zombi se convertirá en un proceso huérfano y luego se adoptará para el primer proceso, y el primer proceso escaneará el proceso secundario con su nombre y recuperará el proceso de estado Z;

ps -ef  | grep 66046
qtest    66046      12321  99 Apr07 ?        992-23:20:31 [kvsvr] <defunct>

kill -9  12321

2. Recordatorio de riesgo operacional

Antes de matar el proceso principal, se recomienda evaluar el riesgo operativo y ver qué otros procesos asociados con el proceso principal pueden tolerar la muerte.




En tercer lugar, el método de asesinato violento del proceso zombi.


1. Reiniciar

Si el proceso principal del proceso zombie es el proceso n. ° 1 (ppid = 1),

ps -ef  | grep 66046
qtest    66046      1  99 Apr07 ?        992-23:20:31 [kvsvr] <defunct>

Así que kill ya no funcionará, solo puedes reiniciar el servidor para resolverlo;


2. Recordatorio de riesgo operacional

Reiniciar es relativamente simple y grosero, pero también es efectivo. Se
recomienda determinar si se puede resolver reiniciando en función de si los servicios anteriores pueden tolerar el impacto del reinicio.




4. ¿Por qué el ppid de un proceso zombi puede ser 1?


1. Teóricamente, el proceso asumido por Init no se convertirá en un zombi

Al final de cada proceso, el sistema escaneará todos los procesos que se ejecutan en el sistema actual para
ver si algún proceso es un proceso hijo del proceso que acaba de finalizar.
Si es así, el proceso de inicio se hará cargo de él y se convertirá en él. proceso principal para garantizar que cada proceso tenga un proceso principal.


En términos generales,
una vez que el proceso init asume el control del proceso en el estado Z, llamará a wait para reciclarlo.
Por lo tanto, en teoría, todos los procesos asumidos por Init no se convertirán en procesos zombies.


Entonces, ¿por qué hay procesos zombies con ppid 1?



2. Intenta especular sobre una posibilidad

De vuelta a la causa raíz del proceso zombie "salida del proceso" Aquí, aquí hay un intento de especular sobre una posibilidad:

La función del kernel do_exit se llama cuando finaliza el proceso. Esta función tiene dos lógicas clave:

do_exit()
  ->exit_notify()
     -> do_notify_parent()

2.1 Como proceso padre: busque un nuevo proceso padre para su proceso hijo (si existe) **

Si el proceso que se va a salir es un proceso de múltiples subprocesos, puede confiar el proceso hijo a su propio subproceso hermano,
si no existe tal subproceso, confíe al proceso de inicio; en
resumen, el proceso de inicio hará el truco.


2.2 Como un proceso secundario: notifique a su proceso padre que libere task_struct para usted **

Para los procesos de un solo subproceso, este proceso también es relativamente simple;
pero para los procesos de múltiples subprocesos, es un poco más complicado:
porque solo el subproceso principal del grupo de subprocesos es elegible para notificar al proceso principal,
cuando otros subprocesos del grupo de subprocesos terminan, no serán notificados. El proceso padre ni siquiera necesita reservar recursos para entrar en el estado zombi. Se hace llamando directamente a la función release_task para liberar todos los recursos.

Dado que el proceso principal solo reconoce el subproceso principal del proceso secundario, en el grupo de subprocesos, si el subproceso principal termina, pero si hay otros subprocesos ejecutándose en el grupo de subprocesos, no se notificará al proceso principal que libere task_struct por sí mismo. hasta que el grupo de subprocesos Solo se liberará cuando salga el último subproceso.

Por lo tanto, en el modo de usuario, puede llamar a pthread_exit para dejar que el subproceso principal salga primero, pero en el modo kernel, es posible que deba retener el task_struct del subproceso principal porque hay otros subprocesos ejecutándose en el grupo de subprocesos; en este caso , el hilo principal se convertirá en estado zombi, incluso si init se hace cargo del hilo principal, no cambiará.


Entonces, el fenómeno de que el ppid del "proceso zombie" es 1.

Supongo que te gusta

Origin blog.csdn.net/weixin_44648216/article/details/111877287
Recomendado
Clasificación