web-dev-qa-db-fra.com

killall ne tue pas tout et tue rarement, quelle est la commande pour alors?

J'utilise parfois la commande killallpour tuer des processus. La raison pour laquelle je dis ocassionally, c'est que dans certains cas, cela n'a pas fonctionné pour moi.

Un exemple récent concernait Thunderbird, où il y avait environ 5 instances en mémoire. J'ai donc décidé d'utiliser la commande killallname__. Il a tué 2 processus et 3 restaient encore en mémoire. Essayé à nouveau et les 3 étaient toujours là.

J'ai donc utilisé manuellement la commande kill -9 pour tuer chacun des processus individuels via leurs pids. Ça a marché.

J'utilise principalement la commande kill -9 comme cela fonctionne. La commande killallm'a laissé tomber tellement de fois que je ne me dérange pas de l'utiliser. Mais il doit y avoir une raison pour laquelle cela ne fonctionne pas. Est-ce que je l'utilise mal?

Je sais qu'il existe d'autres commandes telles que pkillmais je serais reconnaissant de comprendre pourquoi la commande killallne fonctionne pas comme prévu. J'ai même essayé de tuer un seul processus et c'est une affaire de hasard. Mais la commande kill -9 fonctionne à chaque fois.

Des idées?

PS: Sudone fait aucune différence

11
Meer Borg

De la page de manuel de killall

killall envoie un signal à tous les processus exécutant l'une des commandes spécifiées. Si aucun nom de signal n'est spécifié, SIGTERM est envoyé.

Lorsque vous faites un kill -9, vous envoyez le signal SIGKILL. Si vous voulez envoyer un SIGKILL avec killall, vous devez faire

killall -s SIGKILL <PROCESSNAME>

Une bonne explication de la différence entre SIGKILL et SIGTERM (et pourquoi vous devriez d'abord essayer SIGTERM)

De http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

L'envoi de signaux aux processus utilisant kill sur un système Unix n'est pas un sujet nouveau pour la plupart des administrateurs système, mais on m'a souvent demandé quelle était la différence entre kill et kill -9.

Chaque fois que vous utilisez kill sur un processus, vous lui envoyez en réalité un signal (dans presque toutes les situations - je vais entrer dans les détails dans peu de temps). Les applications standard C ont un fichier d’en-tête contenant les étapes à suivre par le processus s’il reçoit un signal particulier. Vous pouvez obtenir une liste complète des signaux disponibles sur votre système en consultant la page de manuel de kill.

Considérons une commande comme celle-ci:

kill 2563

Cela enverrait un signal appelé SIGTERM au processus. Une fois que le processus reçoit la notification, plusieurs choses différentes peuvent se produire:

  • le processus peut s'arrêter immédiatement
  • le processus peut s'arrêter après un court délai après le nettoyage des ressources
  • le processus peut continuer indéfiniment

L'application peut déterminer ce qu'elle veut faire une fois qu'un SIGTERM est reçu. Bien que la plupart des applications nettoient leurs ressources et s’arrêtent, certaines ne le peuvent pas. Une application peut être configurée pour faire quelque chose de complètement différent lorsqu’un SIGTERM est reçu. De plus, si l'application est dans un mauvais état, par exemple en attente d'E/S de disque, il est possible qu'elle ne puisse pas agir sur le signal envoyé.

La plupart des administrateurs système ont généralement recours au signal plus abrupt lorsqu'une application ne répond pas à un SIGTERM:

kill -9 2563

Le -9 indique à la commande kill que vous souhaitez envoyer le signal n ° 9, appelé SIGKILL. Avec un tel nom, il est évident que ce signal a un peu plus de poids.

Bien que SIGKILL soit défini dans le même fichier d’en-tête de signal que SIGTERM, il ne peut être ignoré par le processus. En fait, le processus n’a même pas été mis au courant du signal SIGKILL puisque celui-ci passe directement au début du noyau. À ce stade, init arrêtera le processus. Le processus n'a jamais la possibilité de capter le signal et d'agir en conséquence.

Cependant, le noyau peut ne pas réussir à tuer le processus dans certaines situations. Si le processus attend des E/S réseau ou disque, le noyau ne pourra pas l’arrêter. Les processus Zombie et les processus bloqués dans un sommeil ininterruptible ne peuvent pas non plus être arrêtés par le noyau. Un redémarrage est nécessaire pour effacer ces processus du système.

Lorsque vous avez envoyé killall (SIGTERM) aux processus Thunderbird, vous avez demandé à ces processus de s’arrêter. Certains de ces processus ne fonctionnaient pas correctement (probablement pourquoi vous deviez les tuer en premier lieu), ils ne pouvaient donc pas agir sur le signal SIGTERM.

21
tgm4883

killall accepte presque la même syntaxe que kill. En particulier, il n'est pas nécessaire d'écrire quoi que ce soit pour faire en sorte que killall fasse l'équivalent de kill -9. Cela fonctionne très bien:

killall -9 Thunderbird

(Bien entendu, comme discuté, vous devriez généralement hésiter à utiliser killall -9 ou, de manière équivalente, killall -KILL, à moins que d'autres mesures aient déjà été essayées sans succès.)

4
Eliah Kagan