Was ist der Unterschied zwischen 'killall' und 'pkill'?

88

Nachdem ich jahrelang einfach nur kill <some_pid> auf Unix-Systemen verwendet habe, habe ich pkill von einem jüngeren Linux-versierten Mitarbeiter Kollegen 1 gelernt.

Ich akzeptierte bald den Linux-Weg, pgrep -ing und pkill -ing durch viele Tage und Nächte, durch Verlangsamungen und Rennen Bedingungen. Das war alles gut und gut.

Aber jetzt sehe ich nichts als killall . How-To's scheinen nur killall zu erwähnen, und ich bin mir nicht sicher, ob dies eine Art parallele Entwicklung ist oder ob killall ein Nachfolger von pkill oder etwas anderes ist.

Es scheint als ein gezielteres pkill zu funktionieren, aber ich bin mir sicher, dass etwas fehlt.

Kann eine Ubuntu / Debian-fähige 2 Person erklären, wann (oder warum) killall verwendet werden sollte, insbesondere wenn sie bevorzugt zu pkill verwendet wird (wenn pkill oft scheint einfacher, weil ich mit dem Namensabgleich, mindestens standardmäßig, schlampiger sein kann).

Wenn ich von killall spreche, denke ich nicht an den Befehl, der auf einigen Unix-Systemen (Solaris, AIX,?) alle Benutzerprozesse beenden würde. Hier ist eine Beschreibung dieser Version von eine Hilfeseite für IBM AIX :

  

Der killall Befehl bricht alle ab   Prozesse, die Sie gestartet haben, außer   diejenigen, die den Killall-Prozess produzieren.   Dieser Befehl bietet eine praktische Funktion   Mittel zum Abbrechen aller Prozesse   erstellt von der Shell, die Sie steuern.   Wenn von einem Root-Benutzer gestartet wird, die   killall Befehl bricht alle ab   kündbare Prozesse außer denen   Prozesse, die es gestartet haben. Wenn mehrere   Signale werden angegeben, nur die letzten   Eins ist effektiv.

1 'Kollege' ist ein kostenloses Upgrade von 'Mitarbeiter', also könnte es genauso gut sein.
2 Ursprünglich dachte ich, das wäre eine Linux- oder Debian-Sache , aber einige Quellen sagen, dass das Linux killall von BSD-artigen Unix abgeleitet ist.

    
belacqua 22.02.2011, 08:31

4 Antworten

64

Ich denke, Sie sehen killall in how-to's, weil es standardmäßig den genauen Prozessnamen erfordert, während pkill die grundlegende Mustererkennung durchführt. Somit ist killall sicherer für Benutzer, die blind kopieren und einfügen können.

Pkill und killall haben beide unterschiedliche Optionen. Killall hat eine Flagge, die dem Prozessalter entspricht, pkill hat eine Flagge, um nur Prozesse auf einer gegebenen tty zu töten. Etcetera auf nauuseum. Weder ist besser , sie haben nur unterschiedliche Spezialitäten.

Ich sehe auf ihren man-Seiten, dass killall aus dem psmisp-Paket kommt, das mehrere Dienstprogramme zur Prozessverwaltung hat, aber vor allem nicht enthält ps . Es ist das Paket procps , das unter anderem ps, top, kill und pkill enthält. Ich würde wetten, dass procps ursprünglich nicht pkill hatte, also kratzte psmisc ein Jucken und kam mit killall.

Die pkill / pgrep-Manpage gibt an, dass sie in Solaris 7 eingeführt wurden. Wie Sie bereits erwähnt haben, jgbelacqua , Solaris 'killall war nicht das Dienstprogramm, das psmisc bietet, also hatte Solaris wahrscheinlich nur das Paket procps. Jemand wollte ein Pattern-Matching-Prozess-Tool, also pkill und pgrep. Ob es vom procps dev entwickelt oder nachträglich hinzugefügt wurde, weiß ich nicht. Trotzdem hat es es geschafft und wurde überall ein Teil von * nixes.

Weitere Quellen:

djeikyb 22.02.2011, 09:06
7

Bitte seien Sie vorsichtig mit "killall". Auf einigen Systemen (ich vergesse was), killall tötet alle Prozesse. Es wird Argumente ignorieren und Ihr System zum Stillstand bringen.

    
phessler 30.07.2012 10:26
3

Wenn Sie / etc / bash_completion aktivieren, nach killall <part_of_process_name> und drücken Sie die Tabulatortaste - auto vervollständigt den Prozessnamen aus der Liste der laufenden Prozesse

    
jet 22.02.2011 13:28
2

Wenn Sie sich die Optionen in beiden Programmen ansehen, werden Sie sehen, dass beide dasselbe tun, aber auf unterschiedliche Weise.

pkill führt einen Abgleich für verschiedene Attribute eines Prozesses durch (CMD, PID, PPID, UID ...) und sendet das gegebene Signal an jeden passenden Prozess. (Für CMD wird ein regulärer Ausdruck verwendet, für andere ist es ein String). pkill ist nicht interaktiv, aber besser für Batch-Programme.

killall führt einen Abgleich für den Prozessnamen (comm) oder den Benutzer (user) durch, nicht für die gesamte Befehlszeichenfolge. Das Argument wird als einfache Zeichenfolge verwendet und muss mit dem gesamten "comm" -Wert übereinstimmen (es gibt auch eine Option --regexp, um dies zu ändern). killall hat --interactive und - younger - als Optionen, die pkill nicht hat.

Es gibt auch einen killall5 von SysV days und wurde auf andere UNIX-Varianten portiert (angeblich unter dem Ubuntu-Paket 'sysutils'). Dies verhält sich auf altmodische Weise anders. Dies wurde oft intern verwendet, um die Init-Skripte zu beenden oder in den Einzelbenutzermodus zu wechseln.

    
Arcege 22.02.2011 14:24

Tags und Links