¡Feliz Halloween, Open SOURCE-rers!
Aquí hay una historia tan antigua como epoch tiempo. Desde que existieron C y Unix, y (posteriormente) Linux, hemos tenido zombis . Específicamente, hay procesos que se marcan como un proceso zombie . Incomprendido por algunos, ignorado por otros e inmune a los esfuerzos de tantos de nosotros tratando de kill
estos procesos sin mucho éxito. ¿Por qué es eso?
¿Qué es un proceso en Linux?
Todo comienza cuando se ejecuta un programa en Linux, y cuando lo hace, su instancia en ejecución se denomina proceso. Puede ver todos los procesos en su entorno Linux con ps
comando.
$ ps -ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /usr/lib/systemd/systemd rhgb --switched-root --sys
2 ? S 0:00 [kthreadd]
3 ? I< 0:00 [rcu_gp]
4 ? I< 0:00 [rcu_par_gp]
A veces, un proceso inicia otro proceso, haciendo que el primer proceso sea el padre del segundo. El pstree
comando es una gran herramienta que le permite ver la "genealogía" de los procesos en su sistema.
$ pstree -psn
systemd(1)─┬─systemd-journal(952)
├─systemd-udevd(963)
├─systemd-oomd(1137)
├─systemd-resolve(1138)
├─systemd-userdbd(1139)─┬─systemd-userwor(12707)
│ ├─systemd-userwor(12714)
│ └─systemd-userwor(12715)
├─auditd(1140)───{auditd}(1141)
├─dbus-broker-lau(1164)───dbus-broker(1165)
├─avahi-daemon(1166)───avahi-daemon(1196)
├─bluetoothd(1167)
A cada proceso se le asigna un número en el sistema. El ID de proceso número 1 se asigna al primer proceso que se ejecuta durante el proceso de arranque, y todos los procesos subsiguientes después del PID 1 son descendientes de él. El proceso PID 1 es init , que en la mayoría de las versiones más nuevas de Linux es solo un enlace simbólico al systemd
programa.
Más recursos de Linux
- Hoja de trucos de los comandos de Linux
- Hoja de trucos de comandos avanzados de Linux
- Curso en línea gratuito:Descripción general técnica de RHEL
- Hoja de trucos de red de Linux
- Hoja de trucos de SELinux
- Hoja de trucos de los comandos comunes de Linux
- ¿Qué son los contenedores de Linux?
- Nuestros últimos artículos sobre Linux
Terminar un proceso con el comando kill
Puede finalizar procesos en un sistema Linux con kill
comando. A pesar del nombre, el kill
comando y un conjunto de otros como pkill
y killall
fue escrito/diseñado para enviar SEÑALES a uno o más procesos. Cuando no se especifica, la SEÑAL predeterminada que envía es la señal SIGTERM para terminar el proceso.
Cuando un proceso principal muere o se elimina, y su proceso secundario no sigue la desaparición de su padre, llamamos a ese proceso proceso huérfano .
Cómo matar un proceso zombie
¡Los procesos zombis, por otro lado, no se pueden matar! ¿Por qué podrías preguntar? ¡Pues porque ya están muertos!
Cada proceso secundario, cuando finaliza, se convierte en un proceso zombie y luego lo elimina el padre. Cuando el proceso sale de su existencia y libera los recursos que había utilizado, su nombre todavía está en la tabla de procesos del sistema operativo. Entonces es el trabajo de proceso del padre eliminar su nombre de la tabla de procesos. Cuando eso falla, tenemos el proceso zombi, que ya no es realmente un proceso, sino solo una entrada en la tabla de procesos del sistema operativo.
Esta es la razón por la que intentar hacer un kill
comando incluso con el -9
La opción (SIGKILL) en un proceso difunto (zombie) no funciona, porque no hay nada que matar.
Entonces, para matar un proceso zombie, como para eliminar su nombre de la lista de procesos (la tabla de procesos), debe matar a su padre. Por ejemplo, si el PID 5878 es un proceso zombi y su padre es el PID 4809, entonces para matar al zombi (5878) finaliza el padre (4809):
$ sudo kill -9 4809 #4809 is the parent, not the zombie
Mi última palabra de advertencia sobre los zombis. Tenga mucho cuidado al eliminar los procesos principales. Si el padre de un proceso es PID 1 y lo matas, ¡reiniciarás tú mismo!
¡Y esa será una historia aún más aterradora que contar!