web-dev-qa-db-fra.com

Comment arrêter le processus «ininterrompu» sous Linux?

J'ai un processus VirtualBox autour duquel j'ai essayé de tuer (KILL/ABORT) mais sans succès. Le pid parent est 1 (init).

top montre le processus sous la forme D qui est documenté comme "sommeil sans interruption".

strace ne montre rien.

Comment puis-je le débarrasser de ça? Cela m'empêche de décharger le pilote du noyau VirtualBox pour en charger un plus récent.

45
Tilo Prütz

Réponse simple: vous ne pouvez pas.

Réponse plus longue: le sommeil ininterrompu signifie que le processus ne sera pas réveillé par des signaux. Il ne peut être réveillé que par ce qu'il attend. Quand je reçois de telles situations, par exemple. avec le CD-ROM, je réinitialise généralement l'ordinateur en utilisant la suspension sur disque et en reprenant.

46
jpalecek

Tuer un processus ininterrompu réussit, il ne le fait pas immédiatement. Le processus ne disparaîtra pas tant qu'il n'aura pas réellement reçu le signal. Donc, envoyer un signal seul ne suffit pas pour se débarrasser du processus, vous devez également le réveiller d'un sommeil ininterrompu.

Tanel Poder a écrit un grand guide pour analyser les processus d'état D . Il est très typique que cet état soit provoqué par des E/S incomplètes, par ex. panne de réseau. slm a posté quelques pointeurs très utiles sur superutilisateur comment débrancher les E/S du réseau, et aussi sur le problème lui-même.

Personnellement, lorsque je traite avec Windows sur VirtualBox, et même avec Wine, je rencontre souvent ce problème en raison d'une E/S de cdrom qui ne se termine jamais (je suppose que c'est une sorte de vérification de présence de disque). Les périphériques ATA peuvent être réinitialisés , ce qui désamorcera probablement le processus. Par exemple, j'utilise le petit script suivant pour réinitialiser mes deux lecteurs optiques, en supprimant les processus qu'ils bloquent:

echo 1 > /sys/block/sr0/delete
echo 1 > /sys/block/sr1/delete
echo "- - -" > /sys/class/scsi_Host/host7/scan
24
Carsten Milkau

L'état D signifie essentiellement que le processus attend des E/S disque ou d'autres E/S de bloc qui ne peuvent pas être interrompues. Parfois, cela signifie que le noyau ou le périphérique essaie fiévreusement de lire un mauvais bloc (en particulier à partir d'un disque optique). Parfois, cela signifie qu'il y a autre chose.

Le processus ne peut pas être tué tant qu'il n'est pas sorti de l'état D. Découvrez ce qu'il attend et corrigez cela. Le moyen le plus simple est de redémarrer. Parfois, retirer le disque en question aide, mais cela peut être assez dangereux: défaillance matérielle catastrophique non réparable si vous ne savez pas ce que vous faites (lire: fumée qui sort).

18
user25148

J'ai récemment rencontré un processus dans l'état D sur un serveur distant et je voudrais préciser qu'un redémarrage dur ou un cycle d'alimentation est nécessaire pour supprimer le processus.

N'essayez pas de redémarrer en douceur tant que vous n'avez pas épuisé toutes les autres options. Par exemple, vous pouvez essayer de libérer les ressources auxquelles le processus est suspendu. Un redémarrage progressif peut vous donner un système qui est partiellement arrêté et ne répondra plus à ssh, mais ne redémarrera pas car il est bloqué en essayant de mettre fin au processus ininterrompu.

5
Sarkom

Comme d'autres l'ont dit, un processus ininterrompu est un processus qui est coincé dans une fonction du noyau qui ne peut pas être interrompue (il attend généralement une opération d'E/S). Voir cette réponse pour une description détaillée.

Outre le redémarrage de l'ordinateur, j'ai réussi à sortir certains processus de l'état D en vidant linux VM caches :

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

Cela ne semble pas affecter la stabilité du système, mais je ne suis pas un programmeur système et je ne sais pas quelles conséquences involontaires cela pourrait avoir.


Modifier :

Selon les documentation du noya , drop_caches semble être raisonnablement sûr dans un environnement de développement.

drop_caches

Si vous y écrivez, le noyau supprimera des caches propres, ainsi que des objets de dalles récupérables comme des dentiers et des inodes. Une fois abandonné, leur mémoire devient libre.

Pour libérer la pagecache:

echo 1 > /proc/sys/vm/drop_caches

Pour libérer des objets de dalles récupérables (y compris les dentiers et les inodes):

echo 2 > /proc/sys/vm/drop_caches

Pour libérer des objets de dalle et du cache de page:

echo 3 > /proc/sys/vm/drop_caches

Il s'agit d'une opération non destructive et ne libérera aucun objet sale. Pour augmenter le nombre d'objets libérés par cette opération, l'utilisateur peut exécuter "sync" avant d'écrire dans/proc/sys/vm/drop_caches. Cela minimisera le nombre d'objets sales sur le système et créera plus de candidats à supprimer.

Ce fichier n'est pas un moyen de contrôler la croissance des différents caches du noyau (inodes, denteries, pagecache, etc ...) Ces objets sont automatiquement récupérés par le noyau lorsque de la mémoire est nécessaire ailleurs sur le système.

L'utilisation de ce fichier peut entraîner des problèmes de performances. Puisqu'il supprime les objets mis en cache, il peut coûter une quantité importante d'E/S et de CPU pour recréer les objets abandonnés, surtout s'ils étaient sous une utilisation intensive. Pour cette raison, une utilisation en dehors d'un environnement de test ou de débogage n'est pas recommandée.

Vous pouvez voir des messages d'information dans votre journal du noyau lorsque ce fichier est utilisé:

cat (1234): drop_caches: 3

Ce ne sont que des informations. Ils ne signifient pas que quelque chose ne va pas avec votre système. Pour les désactiver, faites écho 4 (bit 3) dans drop_caches.

4
ostrokach

nouveau ici et pas connu, mais j'ai eu le même problème où je pouvais voir mes processus entrer en veille sans interruption (état D) lorsque j'ai vérifié leur état à l'aide de htop. Pour certaines raisons,

kill -9 <pid>

travaillé pour moi. Vous pouvez peut-être essayer la même chose.

Edit: la réponse détaillée est là-haut par ostrokach (que je n'ai pas vu).

0
Shanks