96 votes

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

Après avoir utilisé un simple kill <some_pid> sur des systèmes Unix pendant de nombreuses années, j'ai appris pkill d'un plus jeune adepte de Linux collègue de travail collègue 1 .

J'ai vite accepté la voie de Linux, pgrep -et pkill -à travers de nombreux jours et nuits, à travers les ralentissements et les conditions de course. Tout cela était très bien.

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

Il semble fonctionner comme un moyen plus ciblé pkill mais je suis sûr que je rate quelque chose.

Un spécialiste d'Ubuntu/Debian peut-il 2 personne explique quand (ou pourquoi) killall devrait être utilisé, en particulier s'il doit être utilisé de préférence à pkill (lorsque pkill semble souvent plus facile, parce que je peux être plus négligent avec la correspondance des noms, au 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, tirée de une page de manuel pour le système AIX d'IBM :

La commande killall annule toutes les processus que vous avez lancés, sauf ceux qui produisent le processus killall. Cette commande fournit un moyen pratique moyen pratique d'annuler tous les processus créés par le Shell que vous contrôlez. Lorsqu'elle est lancée par un utilisateur root, la commande killall annule tous les processus annulables, sauf ceux processus qui l'ont lancée. Si plusieurs signaux sont spécifiés, seul le dernier dernier est effectif.

1 Le terme "collègue" est une mise à jour gratuite de "co-worker", alors autant le faire.
2 Au début, je pensais que c'était un truc de Linux ou Debian, mais certaines sources disent que le Linux killall est dérivé d'Unix à saveur BSD.

72voto

djeikyb Points 28025

Je pense que vous voyez killall dans les guides pratiques parce que, par défaut, il demande le nom précis du processus, alors que pkill fait une correspondance 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 pour correspondre à l'âge du processus, pkill a un drapeau pour tuer uniquement les processus sur un tty donné. Etcetera ad nauseum. Aucun des deux n'est meilleur ils ont juste des spécialités différentes.

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

El page de manuel pkill/pgrep dit qu'ils ont été introduits dans Solaris 7. Comme vous le mentionnez, jgbelacqua Le killall de Solaris n'était pas l'utilitaire fourni par psmisc, donc Solaris n'avait probablement que le paquet procps. Quelqu'un voulait un outil de processus de comparaison de motifs, d'où pkill et pgrep. Je ne sais pas s'il a été développé par le développeur de procps ou ajouté après coup. Quoi qu'il en soit, il a été intégré et est devenu une partie intégrante de tous les *nixes.

Plus de sources :

7voto

phessler Points 89

Faites attention avec "killall". Sur certains systèmes (j'ai oublié lesquels), killall tue todo processus. Il ignorera silencieusement les arguments et arrêtera complètement votre système.

4voto

Max Schmeling Points 6295

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

3voto

Peter Eisentraut Points 7030

Si vous examinez les options des deux programmes, vous verrez qu'ils font à 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...) et enverra le signal donné à chaque processus qui correspond. (Pour CMD, une expression régulière est utilisée, pour les autres, c'est une chaîne de caractères). pkill n'est pas interactif, mais mieux pour les programmes batch.

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

Il existe également un killall5 qui date de l'époque de SysV et qui a été porté sur d'autres variantes d'UNIX (apparemment sous le paquet Ubuntu 'sysutils'). Il se comporte différemment de l'ancienne manière. Il était souvent utilisé en interne à l'init scripts pour arrêter ou passer en mode mono-utilisateur.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X