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

92

Einfach nur nach der Verwendung kill <some_pid>auf Unix - Systemen seit vielen Jahren habe ich gelernt , pkillvon einem jüngeren Linux-versierten Mitarbeitern Kollegen 1 .

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

Aber jetzt sehe ich doch nichts killall. Anleitungen scheinen nur zu erwähnen killall, und ich bin mir nicht sicher, ob dies eine Art parallele Entwicklung ist oder ob killalles sich um einen Nachfolger pkilloder etwas anderes handelt.

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

Kann eine Ubuntu / Debian-versierte 2- Person erklären, wann (oder warum) killallsie verwendet werden sollte, insbesondere, wenn sie bevorzugt verwendet werden sollte pkill(wenn dies pkilloft einfacher erscheint, weil ich mit der Namensübereinstimmung, zumindest in der Standardeinstellung, umständlicher sein kann)?

Wenn killallich davon 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 einer 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 "Mitarbeiter", könnte also auch.
2 Ursprünglich dachte ich, dies sei eine Linux- oder Debian-Sache, aber einige Quellen sagen, dass Linux killallvon Unix mit BSD-Geschmack abgeleitet ist.

belacqua
quelle

Antworten:

68

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 es für Benutzer sicherer, killall blind zu kopieren und einzufü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 können. 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 keine enthält ps. 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.

Die pkill / pgrep Manpage sagt sie in Solaris 7 eingeführt wurden , wie Sie erwähnen, jgbelacqua , von Solaris killall war nicht das Dienstprogramm psmisc bietet, so Solaris wahrscheinlich nur die procps Paket hatte. Jemand wollte ein Pattern-Matching-Prozess-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:

djeikyb
quelle
1
Hmm - es gab ein killall(altes?) Solaris-System, aber es hat sich anders verhalten. Es hat alles getötet.
Belacqua
6
@manish - äh, auf SysV - Systemen gab es einen anderen Killall.
Belacqua
1
@djeikyb Der Gedanke daran, dass Killall sicherer ist, klingt richtig, oder zumindest könnte das einen Großteil seiner Popularität ausmachen.
Belacqua
5
@Manish: pkill (no kill) benötigt weder die PID-Nummer noch den Prozessnamen. Das Muster stimmt mit dem Prozessnamen überein.
Javier Rivera
3
killall is safer for users to blindly copy and paste, außer wenn Sie auf einer Maschine sitzen, auf der killall wirklich alle tötet. Es ist bedauerlich, dass die beiden verschiedenen Dienstprogramme denselben Namen haben.
Lie Ryan
7

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

phessler
quelle
5
Das ist nicht wahr. killall ohne Argumente führt zu nichts und killall ignoriert die Argumente nicht. kill -9 -1könnte Ihr System töten, und killall -9 -1könnte auch. Aber nicht nurkillall [program]
Thomas Ward
6
Es ist wahr auf SysV-Systemen, wie jetzt in der ursprünglichen Frage erwähnt.
Alanc
3

Wenn Sie / etc / bash_completion aktivieren, vervollständigt after killall <part_of_process_name>und hit tab - auto den Prozessnamen aus der Liste der ausgeführten Prozesse

Jet
quelle
2
Dieselbe automatische Vervollständigung wird mit pgrep / pkill durchgeführt. Normalerweise pkill plug<tab>töte ich das Flash-Plugin für Firefox, wenn ich weiß, dass ich für eine Weile nichts verwenden möchte, aber immer noch aktiv Firefox verwenden möchte. Dies ist eine Funktion der Shell, kein Unterschied zwischen killall und pgrep / pkill.
Arcege
1
Ich habe nicht gesagt, ist ein Unterschied - nur eine nette Funktion, um die Suche nach PIDs, Prozessnamen usw. zu vermeiden
Jet
2

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 den 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 aus SysV-Tagen, das 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.

Arcege
quelle
2
Nein, weder pkillnoch killallsollte in Skripten verwendet wird, nur interaktiv und mit Vorsicht zu genießen .
Geirha