web-dev-qa-db-fra.com

Quelle est la différence entre "killall" et "pkill"?

Après avoir utilisé simplement kill <some_pid> sur des systèmes Unix pendant de nombreuses années, j’ai appris pkill à partir d’une version plus récente de Linux. collaborateur collègue1.

J'ai vite accepté les méthodes Linux, pgrep et pkill pendant plusieurs jours et nuits, en raison de ralentissements et de conditions de compétition. C'était très bien.

Mais maintenant je ne vois que killall. Les procédures semblent ne mentionner que killall, et je ne sais pas s'il s'agit d'un développement parallèle, ou si killall est le successeur de pkill ou quelque chose d'autre.

Cela semble fonctionner comme un pkill plus ciblé, mais je suis sûr qu'il me manque quelque chose.

Peut-on savoir utiliser Ubuntu/Debian?2 personne expliquer quand (ou pourquoi) killall devrait être utilisé, surtout s’il devrait être utilisé de préférence à pkill (lorsque pkill semble souvent plus facile, parce que je peux être plus bâclé avec correspondance, au moins par défaut).

Lorsque je parle de killall, je ne songe pas à la commande qui, sur certains systèmes Unix (Solaris, AIX,?) Tuerait tous les processus utilisateur. Voici une description de cette version, à partir de ne page de manuel pour AIX d'IBM :

La commande killall annule tous les processus que vous avez démarrés, à l'exception de ceux produisant le processus killall. Cette commande constitue un moyen pratique d’annuler tous les processus créés par le shell que vous contrôlez. Lorsqu'elle est démarrée par un utilisateur root, la commande killall annule tous les processus annulables, à l'exception de ceux qui l'ont démarrée. Si plusieurs signaux sont spécifiés, seul le dernier est effectif.

1 "collègue" est une mise à jour gratuite de "collègue", vous pourriez en faire autant.
2 A l'origine, je pensais qu'il s'agissait de Linux ou de Debian, mais certaines sources disent que Linux killall est dérivé de Unix à la saveur de BSD.

90
belacqua

Je pense que vous voyez killall dans les procédures à suivre car, par défaut, le nom de processus exact est requis, alors que pkill effectue la correspondance de modèle de base. Ainsi, killall est plus sûr pour les utilisateurs de copier et coller à l'aveugle.

Pkill et killall ont tous deux des options distinctives. Killall a un drapeau à comparer par âge de processus, pkill a un drapeau pour tuer uniquement les processus sur un terminal donné. Etcetera ad nauseum. Ni est meilleur , ils ont juste des spécialités différentes.

Je vois dans leurs pages de manuel que killall provient de paquet psmisc , qui possède plusieurs utilitaires de gestion de processus, mais ne contient notamment pas ps. C'est le paquetage procps qui contient ps, top, kill et pkill (entre autres). Je parierais que procps n'avait pas à l'origine pkill, alors psmisc a gratté une démangeaison et est venu avec killall.

Le page de manuel pkill/pgrep indique qu'ils ont été introduits dans Solaris 7. Comme vous le dites, jgbelacqua , le killall de Solaris n'était pas l'utilitaire fourni par psmisc, de sorte que Solaris probablement seulement eu le paquet procps. Quelqu'un voulait un outil de traitement de correspondance de motif, donc pkill et pgrep. Je ne sais pas s'il a été développé par le développeur procps ou ajouté ultérieurement. Quoi qu’il en soit, il est entré et fait partie de * nixes partout.

Plus de sources:

66
djeikyb

S'il vous plaît soyez prudent avec "killall". Sur certains systèmes (j'oublie lequel), killall tue les processus tous. Il ignorera les arguments en silence et mettra votre système à l'arrêt complet.

7
phessler

si vous activez/etc/bash_completion, après killall <part_of_process_name> et cliquez sur tab - complète automatiquement le nom du processus à partir de la liste des processus en cours d'exécution

3
jet

Si vous regardez les options des deux programmes, vous verrez qu'ils font tous les deux à peu près la même chose, mais de manière différente.

pkill effectuera une correspondance sur divers attributs d'un processus (CMD, PID, PPID, UID, etc.) et enverra le signal donné à chaque processus correspondant. (Pour CMD, une expression régulière est utilisée, pour d'autres c'est une chaîne). pkill n'est pas interactif, mais convient mieux aux programmes batch.

killall effectuera une correspondance sur le nom du processus (comm) ou l'utilisateur (utilisateur), et non sur la chaîne de commande complète. L'argument est utilisé comme une simple chaîne et doit correspondre à la valeur entière de la "comm" (il existe également une option --regexp pour changer cela). killall a les options --interactive et --younger-than, que pkill ne possède pas.

Il y a aussi un killall5 qui date de SysV et qui a été porté vers d'autres variantes UNIX (supposément dans le paquet Ubuntu 'sysutils'). Cela se comporte différemment à l'ancienne. Cela était souvent utilisé en interne dans les scripts d'initialisation pour arrêter ou passer en mode mono-utilisateur.

2
Arcege