Comment tuez-vous une arborescence de processus sous Linux? [fermé]

14

Parfois, l'envoi d'un SIGTERM à un processus entraînera l'envoi de SIGTERM à tous ses processus enfants. Cependant, parfois cela ne fonctionne pas.

Existe-t-il une commande ou un utilitaire qui me permettra de tuer un processus et tous ses processus enfants en même temps? J'ai généralement recours à la collecte manuelle de tous les pids dans une seule commande kill, mais cela semble stupide.

Cette question SO demande comment faire cela avec perl, mais tout ce qui fait le travail serait génial.

itsadok
la source
On dirait que pkill -9c'est plus puissant que pkillpour quelque raison que ce soit.
Andrew

Réponses:

13

En supposant que les processus partagent un identifiant de session (ce qu'ils devraient sauf s'ils ont explicitement appelé setsid (), vous pouvez les tuer par session en utilisant pkill:

user@machine:~> ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$

Si depuis un autre terminal je fais:

pkill -9 -s 12804

Puis tout meurt d'un seul coup.

Vous pouvez également tuer par groupe de processus, bien que cela ait tendance à être plus utile pour de nombreux enfants qui se trouvent tous un niveau en dessous d'un parent, et non une chaîne de processus associés.

James F
la source
2

Habituellement, un client répondant doit recevoir un sigterm et se désactiver lui-même, mettant ainsi fin à tous ses processus enfants bifurqués. Si, en revanche, le client ne répond pas, un signal de terminaison normal n'évoquera probablement aucune réponse.

Donc, vous continuez ensuite à envoyer un SIGKILL, qui indique au système lui-même de faire arrêter ce processus, maintenant - ce qu'il peut faire la plupart du temps, sauf lorsque le processus est dans un état de sommeil ininterruptible, comme attendre des E / S entrée ou similaire.

Dans ce cas, même le SIGKILL finira par ne rien faire dans le processus; le processus enfant sera probablement dans un état de retard similaire.

Il existe un cas limite où le processus parent peut se terminer très bien, mais le processus enfant n'est pas éliminable. Ensuite, vous vous retrouverez avec un processus zombie qui ne peut pas être nettoyé depuis que son père est parti, mais il ne répond à rien. La seule façon de s'en débarrasser est un redémarrage; dans la plupart des cas, cependant, ils sont tout à fait inoffensifs, car la seule chose qu'ils font est de prendre un PID alors que la prise qu'ils ont essayé d'utiliser s'est déjà fanée.

Towo
la source
2

Si je veux tuer l'arborescence des processus de Firefox, est-il possible de le tuer par la commande ci-dessus "pkill -9 -s firefox"


la source