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

92

Après avoir utilisé tout simplement kill <some_pid>sur les systèmes Unix depuis de nombreuses années, j'ai appris pkilld'un Linux-savvy jeune collègue collègue 1 .

J'ai vite accepté le Linux-way, pgrep-ment et pkill-ment à travers de nombreux jours et nuits, grâce à des ralentissements et des conditions de course. C'était très bien.

Mais maintenant je ne vois rien mais killall. Les tutoriels semblent seulement mentionner killall, et je ne suis pas sûr qu'il s'agisse d'un développement parallèle, d' killallun successeur pkillou de quelque chose d'autre.

Cela semble fonctionner de manière plus ciblée pkill, mais je suis sûr qu'il me manque quelque chose.

Est-ce qu'une personne au courant de Ubuntu / Debian 2 peut expliquer quand (ou pourquoi) killalldevrait être utilisée, surtout si elle devrait être utilisée de préférence à pkill(quand pkillcela semble souvent plus facile, parce que je peux être plus bâclé avec la correspondance de noms, au moins par défaut).

En parlant de killall, je ne pense pas à la commande qui, sur certains systèmes Unix (Solaris, AIX,?) Tuerait tous les processus utilisateur. Voici une description de cette version, issue d' une 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 À l’origine, j’imaginais que c’était une chose sous Linux ou Debian, mais certaines sources disent que Linux killallest dérivé de Unix à la saveur de BSD.

Belacqua
la source

Réponses:

68

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 aveuglément.

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 mieux , ils ont juste différentes spécialités.

Je vois dans leurs pages de manuel que killall provient du paquetage psmisc , qui contient plusieurs utilitaires de gestion de processus, mais ne le contient notamment pas ps. C'est le paquet 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.

La 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. Par conséquent, Solaris ne disposait probablement que du 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:

djeikyb
la source
1
Hmm - il y avait un killall(vieux?) Système Solaris, mais il se comportait différemment. Ça a tout tué.
Belacqua
6
@manish - euh, il y avait un killall différent sur les systèmes SysV.
Belacqua
1
@djeikyb L'idée que killall soit plus sûr semble correcte, ou du moins, cela pourrait expliquer en grande partie sa popularité.
Belacqua
5
@Manish: pkill (no kill) n'a pas besoin du numéro de pid, ni du nom du processus. Il fait correspondre le nom du processus.
Javier Rivera
3
killall is safer for users to blindly copy and paste, sauf si vous êtes sur une machine où killall tue vraiment tout. Il est regrettable que les deux services publics portent le même nom.
Lie Ryan
7

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

Phessler
la source
5
Ce n'est pas vrai. killall sans aucun argument ne fera rien, et killall n'ignorera pas les arguments. kill -9 -1pourrait tuer votre système, et killall -9 -1pourrait aussi bien. Mais pas seulementkillall [program]
Thomas Ward
6
C'est vrai sur les systèmes SysV, comme mentionné maintenant dans la question initiale.
Alanc
3

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

jet
la source
2
La même complétion automatique sera effectuée avec pgrep / pkill. Une chose que je fais couramment est pkill plug<tab>de tuer le plugin flash pour firefox quand je sais que je n'ai plus rien à utiliser pendant un moment, mais que je veux quand même utiliser activement firefox. C'est une fonction du shell, pas une différence entre killall et pgrep / pkill.
Arcege
1
Je n'ai pas dit que c'est une différence - juste une fonctionnalité intéressante pour éviter de rechercher des PID, des noms de processus, etc.
jet
2

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.

Arcege
la source
2
Non, ni pkillne killalldevrait être utilisé dans les scripts, uniquement de manière interactive et avec prudence.
geirha