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 puedeskill
hacerlo, 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
vfork
llamada al sistema.vfork
es comofork
, excepto que el espacio de direcciones no se copia del padre en el hijo, en anticipación de unaexec
que simplemente arrojaría los datos copiados. Convenientemente para nosotros, cuando ustedvfork
el padre espera ininterrumpidamente (a modo dewait_on_completion
) en el niñoexec
oexit
: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_KILLABLE
estado.