2009-04-20 55 views
31

Tengo un proceso de VirtualBox dando vueltas que he intentado matar (-KILL/-ABORT) pero sin éxito. El padre pid es 1 (init).¿Cómo detener el proceso 'ininterrumpible' en Linux?

top muestra el proceso como D que está documentado como "suspensión ininterrumpida".

strace no aparece nada.

¿Cómo puedo deshacerme de esto? Me impide descargar el controlador del kernel de vbox para cargar uno más nuevo.

+0

¿Tal vez mejor en ServerFault? – dmckee

+0

Que aún no está en línea, por lo que puedo ver. Gracias por el consejo de todos modos. –

Respuesta

36

Respuesta simple: no se puede.

Respuesta más larga: la suspensión ininterrumpida significa que el proceso no se activará por señales. Solo puede ser despertado por lo que está esperando. Cuando obtengo tales situaciones, por ej. con CD-ROM, por lo general reinicio la computadora al usar suspend-to-disk y reanudar.

15

El estado D básicamente significa que el proceso está esperando E/S de disco u otras E/S de bloque que no se pueden interrumpir. A veces esto significa que el kernel o dispositivo está intentando febrilmente leer un bloque defectuoso (especialmente desde un disco óptico). A veces significa que hay algo más.

El proceso no se puede eliminar hasta que salga del estado D. Descubra lo que está esperando y solucione eso. La manera más fácil es reiniciar. A veces, eliminar el disco en cuestión ayuda, pero puede ser bastante peligroso: falla irreparable de hardware catastrófico si no sabes lo que estás haciendo (léase: sale humo).

3

Recientemente encontré un proceso en el estado D en un servidor remoto y me gustaría aclarar que un reinicio completo o un ciclo de encendido es necesario para eliminar el proceso.

No intente un reinicio suave hasta que haya agotado todas las otras opciones. Por ejemplo, puedes intentar liberar cualquier recurso en el que se encuentre el proceso. Un reinicio suave puede darle un sistema que está parcialmente apagado y ya no responderá a ssh, pero no se reiniciará porque está suspendido tratando de finalizar el proceso ininterrumpible.

11

Eliminar un proceso ininterrumpido tiene éxito, simplemente no lo hace de inmediato. El proceso no desaparecerá hasta que realmente reciba la señal. Entonces, enviar una señal por sí solo no es suficiente para deshacerse del proceso, también debe despertarlo del sueño ininterrumpido.

Tanel Poder ha escrito un gran guide to analyse D state processes. Es muy típico que este estado sea causado por una E/S incompleta, p. falla de red. slm ha publicado algunos very useful pointers on superuser cómo desbloquear la E/S de la red, y también sobre el problema en sí.

Personalmente, cuando trato con Windows en VirtualBox, e incluso con vino, a menudo me encuentro con este problema debido a una E/S de cdrom que nunca termina (supongo que es una especie de comprobación de presencia de disco). ATA devices can be reset, que probablemente destrabará el proceso. Por ejemplo, estoy usando el siguiente pequeño script para reiniciar mis dos unidades ópticas, desatascar los procesos que están bloqueando:

echo 1 > /sys/block/sr0/delete 
echo 1 > /sys/block/sr1/delete 
echo "- - -" > /sys/class/scsi_host/host7/scan 
1

Como han dicho otros, un proceso ininterrumpible es un proceso que se ha quedado atascado en una función del núcleo que no se puede interrumpir (generalmente está esperando alguna operación de E/S). Ver this answer para una descripción detallada.

Aparte de reiniciar el equipo, que tuvo un éxito trayendo algunos procesos fuera del estado D por flushing linux VM caches:

kill -9 {process_id} 
sync 
echo 3 | sudo tee /proc/sys/vm/drop_caches 

esto no parece afectar a la estabilidad del sistema, pero no soy un programador de sistemas y no seguro qué consecuencias involuntarias esto podría tener.


Editar:

De acuerdo con la kernel docs, drop_caches parece ser razonablemente seguro en un entorno de desarrollo.

drop_caches

Escribiendo a esto hará que el núcleo descarte cachés limpias, así como objetos losa recuperables como dentries y inodos. Una vez caído, su memoria se vuelve gratuita.

Para memoria intermedia de páginas libre:

echo 1 > /proc/sys/vm/drop_caches 

Para liberar objetos losa deducible (incluye dentries y inodes):

echo 2 > /proc/sys/vm/drop_caches 

a los objetos de losa libres y memoria intermedia de páginas:

echo 3 > /proc/sys/vm/drop_caches 

Este es una operación no destructiva y no liberará ningún objeto sucio. Para aumentar el número de objetos liberados por esta operación, el usuario puede ejecutar `sync 'antes de escribir en/proc/sys/vm/drop_caches. Esto minimizará el número de objetos sucios en el sistema y creará más candidatos que serán caídos.

Este archivo no es un medio para controlar el crecimiento de los distintos cachés núcleo (i-nodos, dentries, pagecache, etc ...) Estos objetos son automáticamente reclamados por el núcleo cuando la memoria se necesita otro lugar del sistema.

El uso de este archivo puede causar problemas de rendimiento. Como descarta los objetos almacenados en caché, puede costar una cantidad significativa de E/S y CPU recrear los objetos caídos , especialmente si se usaban mucho. Debido a esto, no se recomienda el uso de fuera de un entorno de prueba o depuración.

Usted puede ver los mensajes informativos en su registro del núcleo cuando este fichero es utilizado :

cat (1234): drop_caches: 3 

Estos son sólo informativas. No significan que nada esté mal con su sistema. Para desactivarlos, echo 4 (bit 3) en drop_caches.

Cuestiones relacionadas