it-swarm.com.de

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

Nachdem ich viele Jahre lang nur kill <some_pid> auf Unix-Systemen verwendet hatte, lernte ich pkill von einem jüngeren Linux-Kenner mitarbeiter Kollege1.

Ich akzeptierte bald den Linux-Weg, pgrep- und pkill- durch viele Tage und Nächte, durch Verlangsamungen und Rennbedingungen. Das war alles schön und gut.

Aber jetzt sehe ich nichts als killall. Anleitungen 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 ist, oder etwas anderes.

Es scheint gezielter zu funktionieren pkill, aber ich bin mir sicher, dass mir etwas fehlt.

Kann ein Ubuntu/Debian-versierter2 Person erklären, wann (oder warum) killall verwendet werden sollte, insbesondere, wenn es anstelle von pkill verwendet werden sollte (wenn pkill oft einfacher erscheint, weil ich mit der Namensübereinstimmung umständlicher sein kann, zumindest standardmäßig).

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 aus eine Manpage für IBMs AIX :

Der Befehl killall bricht alle Prozesse ab, die Sie gestartet haben, mit Ausnahme derjenigen, die den killall-Prozess erzeugen. Mit diesem Befehl können Sie bequem alle Prozesse abbrechen, die von der von Ihnen gesteuerten Shell erstellt wurden. Wenn der Befehl killall von einem Root-Benutzer gestartet wird, werden alle abbrechbaren Prozesse mit Ausnahme der Prozesse, die ihn gestartet haben, abgebrochen. Wenn mehrere Signale angegeben sind, ist nur das letzte wirksam.

1 "kollege" ist ein kostenloses Upgrade von "kollege", könnte also auch.
2 Ursprünglich dachte ich, dies sei eine Linux- oder Debian-Sache, aber einige Quellen sagen, dass Linux killall von Unix mit BSD-Geschmack abgeleitet ist.

90
belacqua

Ich denke, Sie sehen killall in den Anleitungen, weil standardmäßig der genaue Prozessname erforderlich ist, während pkill den grundlegenden Mustervergleich ausführt. Daher ist killall für Benutzer sicherer, wenn sie blind kopieren und einfügen.

Pkill und killall haben beide Unterscheidungsmöglichkeiten. Killall hat ein Flag, das dem Prozessalter entspricht, pkill ein Flag, mit dem nur Prozesse eines bestimmten Tty abgebrochen werden. Etcetera ad nauseum. Weder ist besser , sie haben nur verschiedene Spezialitäten.

Ich sehe in ihren Manpages, dass killall aus dem psmisc-Paket stammt, das mehrere Dienstprogramme zur Prozessverwaltung enthält, aber insbesondere ps nicht enthält. Es ist das procps-Paket , das unter anderem ps, top, kill und pkill enthält. Ich würde wetten, dass procps ursprünglich kein pkill hatte, also kratzte psmisc einen Juckreiz und kam mit killall auf.

In der Manpage pkill/pgrep heißt es, dass sie in Solaris 7 eingeführt wurden. Wie Sie bereits erwähnt haben, jgbelacqua war Solaris 'killall nicht das Dienstprogramm, das psmisc zur Verfügung stellt, daher verfügte Solaris wahrscheinlich nur über die procps Paket. Jemand wollte ein Pattern-Matching-Tool, also pkill und pgrep. Ob es vom procps-Entwickler entwickelt oder nachträglich hinzugefügt wurde, weiß ich nicht. Egal, es hat es geschafft und ist überall Teil von * nixes geworden.

Weitere Quellen:

66
djeikyb

Bitte seien Sie vorsichtig mit "killall". Auf einigen Systemen (ich vergesse welche) tötet killall alle Prozesse. Argumente werden stillschweigend ignoriert und Ihr System wird vollständig angehalten.

7
phessler

wenn Sie/etc/bash_completion nach killall <part_of_process_name> aktivieren und auf tab - auto klicken, wird der Prozessname aus der Liste der ausgeführten Prozesse vervollständigt

3
jet

Wenn Sie sich die Optionen beider Programme ansehen, werden Sie feststellen, 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 angegebene Signal an jeden passenden Prozess. (Bei CMD wird ein regulärer Ausdruck verwendet, bei anderen 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 die Option --regexp, um dies zu ändern). killall hat --interactive und --younger-than Optionen, die pkill nicht hat.

Es gibt auch ein killall5, das aus SysV-Tagen stammt und auf andere UNIX-Varianten portiert wurde (angeblich unter dem Ubuntu-Paket 'sysutils'). Dies verhält sich anders als in der alten Mode. Dies wurde häufig intern für die Init-Skripte verwendet, um herunterzufahren oder in den Einzelbenutzermodus zu wechseln.

2
Arcege