Para escenarios de prueba de catástrofe en nuestro entorno de servidor, estamos buscando una manera fácil de hacer que un proceso se atasque en estado D (suspensión ininterrumpida).
¿Alguna forma fácil? Un ejemplo de código de ejemplo C sería un plus :)
Editar : la primera respuesta es semi-correcta, ya que se muestra que el proceso está en estado D, pero aún recibe señales y puede ser eliminado
                    
                        process
                                process-management
                                benchmark
                                
                    
                    
                        er453r
fuente
                
                fuente

Respuestas:
Tuve el mismo problema y lo resolví creando un módulo de kernel que se atasca en estado D.
Como no tengo experiencia en módulos, tomé el código de esta publicación con algunas modificaciones encontradas en algún lugar .
El resultado es un dispositivo en / dev / memory que se atasca en la lectura pero se puede activar escribiendo en él (necesita dos escrituras, no sé por qué pero no me importa).
Para usarlo solo:
Para desbloquear, desde otra terminal:
Makefile:
Código para memory.c:
fuente
De https://blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
Un proceso se pone en suspensión ininterrumpida
(STAT D)cuando necesita esperar algo (generalmente E / S) y no debe manejar señales mientras espera. Esto significa que no puedeskillhacerlo, porque todo lo que mata es enviarle señales. Esto podría suceder en el mundo real si desconecta su servidor NFS mientras otras máquinas tienen conexiones de red abiertas.Podemos crear nuestros propios procesos ininterrumpibles de duración limitada aprovechando la
vforkllamada al sistema.vforkes comofork, excepto que el espacio de direcciones no se copia del padre en el hijo, en anticipación de unaexecque simplemente arrojaría los datos copiados. Convenientemente para nosotros, cuando ustedvforkel padre espera ininterrumpidamente (a modo dewait_on_completion) en el niñoexecoexit:Vemos al niño (
PID 1973, PPID 1972) en un sueño interrumpible y al padre (PID 1972, PPID 13291- el caparazón) en un sueño ininterrumpible mientras espera 60 segundos en el niño.Una cosa interesante (¿traviesa?) De este script es que los procesos en reposo ininterrumpible contribuyen al promedio de carga de una máquina. Por lo tanto, podría ejecutar este script 100 veces para proporcionar temporalmente a una máquina un promedio de carga elevado en 100, según lo informado por
uptime.fuente
kill: /Básicamente, no puedes. Lea este artículo, titulado: TASK_KILLABLE: Nuevo estado del proceso en Linux .
extractoEste SO Q&A titulado: ¿Qué es un proceso ininterrumpido? También lo explica.
Descubrí esto en este libro muy interesante titulado: La interfaz de programación de Linux: un manual de programación del sistema Linux y UNIX .
fuente
TASK_KILLABLEestado.