Comment tuer un processus qui ne peut pas être tué sans redémarrer?

11

Il y a 5 processus qui ne peuvent pas être tués kill -9 $PIDet l'exécution cat /proc/$PID/cmdlinesuspendra la session en cours. Ce sont peut-être des processus zombies.

L'exécution ps -ef or htopsuspendra également la session en cours. Mais topet ps -efonctionnent bien.

Il semble donc que le système de fichiers ne réponde pas à deux problèmes.

Il s'agit d'une machine de production exécutant des machines virtuelles, donc le redémarrage n'est pas une option.

Les identifiants de processus suivants ne fonctionnent pas: 16181 16765 5985 7427 7547

Le parent de ces processus est init

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

Et l'un des processus qemu ne fonctionne pas

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)
Sam Stoelinga
la source
1
Les processus zombies ne devraient pas poser de problème. Si le nombre de processus Zombie est si important qu'il dépasse la limite de processus sur le serveur, cela entraînera un problème.
Raza
@Salton: Nous ne pouvons pas utiliser ps -ef et htop donc nous avons eu quelques problèmes, peut-être que ce que nous voyons n'est pas appelé un processus zombie?
Sam Stoelinga
1
Vous pouvez essayer de tracer en utilisant /usr/bin/strace ps -efpour voir exactement où votre ps -efaccroche.
Raza
2
Comment avez-vous déterminé qu'il s'agissait de zombies? Cela ressemble plutôt à des processus suspendus. Fonctionne ps -elet dans quel état se trouvent ces processus?
Nils
Au final, le client a quand même décidé de redémarrer la machine car les problèmes s'aggravaient de plus en plus. Merci pour toute la contribution. J'ai beaucoup appris sur les zombies et les processus ininterrompus.
Sam Stoelinga

Réponses:

22

Vous n'avez pas de zombies. cat /proc/$PID/cmdlinen'aurait aucun problème avec un zombie. Si kill -9ne tue pas le programme , cela signifie que le programme effectue une opération d'E / S ininterrompue. Cela indique généralement l'une des trois choses:

  • un système de fichiers réseau qui ne répond pas;
  • un bug du noyau;
  • un bug matériel.

Des utilitaires tels que pspeuvent se bloquer s'ils essaient de lire certaines informations telles que le chemin exécutable du processus que le noyau ne fournit pas pour l'une des raisons ci-dessus.

Essayez cat /proc/16181/syscallde voir ce que fait le processus 16181. Cela peut ou non fonctionner selon la distance de votre système.

Si le problème est un système de fichiers réseau, vous pourrez peut-être le démonter de force ou le mettre en ligne. Si le problème est un bug du noyau ou du matériel, ce que vous pouvez faire dépendra de la nature du bug. Le redémarrage (et la mise à niveau vers un noyau fixe, ou le remplacement du matériel cassé) est fortement recommandé.

Gilles 'SO- arrête d'être méchant'
la source
Le chat ne répond jamais. Je ne pense pas que ce soit un bug. je pense que c'est une "fonctionnalité".
Owl
7

Les autres réponses supposent qu'il s'agit de processus zombies. Un processus zombie est un processus qui a fini de s'exécuter, mais qui est toujours dans la table de processus au cas où le parent voudrait connaître l'état de sortie. Celles-ci sont normales et initnettoieront automatiquement les processus zombies qui leur sont assignés.

Les processus zombies ne devraient jamais provoquer de blocage, il semble donc que cela ne soit pas votre problème. S'il s'agit d'un appel système ou d'un pilote bloqué, le processus peut être dans un état ininterrompu. Il y a une bonne explication ici .

David Baggerman
la source
Trop de processus zombies peuvent empêcher forkde réussir (lorsque difficile nrpocest atteint) car ils occupent toujours de l'espace dans la table de processus.
dhchdhd
2

Pour trouver des processus zombies sur Linux:

$ ps axo stat, ppid, pid, comm | grep -w défunt

Z 555 10242 Damn-Zombie <défunt>

Tout d'abord, vous pouvez essayer d'envoyer un signal SIGCHLD au processus parent du zombie en utilisant la commande kill. Notez que la commande ci-dessus vous donne le PPID (PID du processus parent) de chaque zombie. Dans notre exemple, le PPID du zombie est 555.

$ sudo kill -s SIGCHLD 555

Si un processus zombie ne disparaît toujours pas, vous pouvez tuer le processus parent (par exemple, 555) du zombie.

$ sudo kill -9 555

Une fois son processus parent tué, le zombie sera adopté par le processus init, qui est le parent de tous les processus sous Linux. Le processus init appelle périodiquement wait()pour récolter tout processus zombie.

HamTheAstroChimp
la source
Telle est la vraie réponse. Tuer le parent a fonctionné, merci.
Andrew
1

Vous ne pouvez tuer un zombie qu'en tuant son parent. Un processus zombie a libéré toutes ses ressources et attend que son statut de sortie soit récupéré par son parent. Il devient un zombie lorsque le parent n'exécute pas un waitpour récupérer le statut de sortie de son enfant. Lorsque vous tuez le parent du zombie, initrécupère le statut de sortie et le zombie meurt finalement.

unnut
la source
Alors tu veux que je tue init? Ce n'est pas clair de la question désolé hehe mais le parent semble être init :( J'ai édité la question.
Sam Stoelinga
4
Non, nous voulons que vous n'essayiez pas de tuer le zombie. Vous ne pouvez pas tuer un zombie. Cette FAQ est aussi ancienne qu'Unix lui-même.
tripleee
@tripleee: Oui c'est ce que j'ai compris. Peut-être que ce que je vis n'est pas un zombie. htop ne fonctionne pas et cat / proc / $ pid / cmdline ou ls / proc / $ pid / ne fonctionne pas non plus. Normalement, cela ne se produit pas avec les zombies, c'est pourquoi j'ai demandé ici, ce n'est pas un problème commun imo. J'ai vérifié plusieurs réponses qui vous disent toutes de tuer le parent, qui est init dans mon cas ou de redémarrer.
Sam Stoelinga
1
"Tuez le parent" est le moyen de récolter un zombie ordinaire. Tu ne peux pas tuer init. Si un zombie est réparé sous init, vous ne pouvez pas le tuer.
tripleee