Question Quelle est la différence entre 'killall' et 'pkill'?


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

J'ai rapidement accepté le cheminement Linux,pgrep-ing et pkill-dans plusieurs jours et nuits, à travers les ralentissements et les conditions de course. C'était très bien.

Mais maintenant je ne vois rien mais killall. Les procédures semblent ne mentionner que killall, et je ne suis pas sûr que ce soit une sorte de développement parallèle, ou si killall est un successeur à pkill, ou autre chose.

Il semble fonctionner comme une cible plus ciblée. pkill, mais je suis sûr qu'il me manque quelque chose.

Est-ce qu'un Ubuntu / Debian-savvy2 personne expliquer quand (ou pourquoi) killall devrait être utilisé, en particulier s'il doit être utilisé de préférence à pkill (quand pkill semble souvent plus facile, car je peux être plus négligent avec la correspondance de noms, du moins par défaut).

En parlant de killall, Je ne pense pas à la commande qui sur certains systèmes Unix (Solaris, AIX,?) Tue tous les processus utilisateur. Voici une description de cette version, à partir de une page de manuel pour IBM AIX:

La commande killall annule tout   processus que vous avez démarré, sauf   ceux qui produisent le processus de destruction.   Cette commande fournit une   moyens d'annuler tous les processus   créé par le shell que vous contrôlez.   Lorsqu'il est démarré par un utilisateur root, le   commande killall annule tout   processus résiliables sauf ceux   processus qui l'a démarré. Si plusieurs   Les signaux sont spécifiés, seulement le dernier   l'un est efficace.

1 «collègue» est une mise à niveau gratuite de «collègue», aussi bien.
2 A l'origine, je pensais que c'était une chose Linux ou Debian, mais certaines sources disent que le Linux killall est dérivé de Unix à saveur BSD.


88
2018-02-22 07:31


origine




Réponses:


Je pense que vous voyez des killalls dans les how-to car, par défaut, il nécessite le nom précis du processus, alors que pkill fait des correspondances de base. Ainsi, killall est plus sûr pour les utilisateurs de copier et coller à l'aveuglette.

Pkill et killall ont tous deux des options distinctes. Killall a un drapeau pour correspondre à l'âge du processus, pkill a un drapeau pour ne tuer que les processus sur un tty donné. Etcetera ad nauseum. Ni l'un ni l'autre n'est meilleur, ils ont juste des spécialités différentes.

Je vois de leurs pages de manuel que killall vient de la package psmisc, qui dispose de plusieurs utilitaires de gestion de processus, mais ne contient notamment pas ps. C'est le paquet procps qui a ps, top, kill et pkill (entre autres). Je parierais que Procps n'avait pas à l'origine de pkill, donc psmisc a démangé et est venu avec killall.

le page de manuel pkill / pgrep dit qu'ils ont été introduits dans Solaris 7. Comme vous le mentionnez, jgbelacquaLe killall de Solaris n’était pas l’utilitaire fourni par psmisc, ainsi Solaris n’avait probablement que le paquet procps. Quelqu'un voulait un outil de processus de correspondance de modèle, donc pkill et pgrep. Que ce soit développé par le développeur ou ajouté par la suite, je ne sais pas. Indépendamment, il a réussi à faire partie de * nixes partout.

Plus de sources:


64
2018-02-22 08:06



Hmm - il y avait un killall sur les anciens systèmes Solaris, mais il se comportait différemment. Il a tout tué. - belacqua
@manish - er, il y avait un killall différent sur les systèmes SysV. - belacqua
@djeikyb L'idée que le killall soit plus sûr semble juste, ou du moins cela pourrait expliquer sa popularité. - belacqua
@Manish: pkill (no kill) n'a pas besoin du numéro de pid, ni du nom du processus. Il correspond parfaitement au nom du processus. - Javier Rivera
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 aient le même nom. - Lie Ryan


S'il vous plaît soyez prudent avec "killall". Sur certains systèmes (j'oublie lequel), killall tue tout processus. Il ignore silencieusement les arguments et interrompt complètement votre système.


7
2017-07-30 08:26



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


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


3
2018-02-22 12:28



Le même auto-complétion se fera avec pgrep / pkill. Quelque chose que je fais souvent est pkill plug<tab> tuer le plugin flash pour Firefox quand je sais que je n'ai rien que je veux utiliser pendant un moment mais que je veux toujours utiliser activement Firefox. Ceci est une fonction du shell, pas une différence entre killall et pgrep / pkill. - Arcege
Je n'ai pas dit est une différence - juste une fonctionnalité intéressante pour éviter de chercher des PID, des noms de processus, etc. - jet


Si vous examinez les options des deux programmes, vous verrez qu’elles agissent toutes deux de la même manière, mais de différentes manières.

pkill effectuera la correspondance sur différents attributs d'un processus (CMD, PID, PPID, UID ...) et enverra le signal donné à chaque processus correspondant. (Pour CMD, une expression régulière est utilisée, pour d’autres une chaîne). pkill n'est pas interactif, mais meilleur pour les programmes par lots.

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

Il existe également un killall5 issu des jours SysV et porté sur d'autres variantes UNIX (supposément sous le paquet Ubuntu 'sysutils'). Cela se comporte différemment à l'ancienne. Cela était souvent utilisé en interne pour les scripts d'initialisation pour arrêter ou passer en mode mono-utilisateur.


2
2018-02-22 13:24



Non, ni pkill ni killall devrait être utilisé dans les scripts, uniquement de manière interactive, et avec prudence. - geirha