Was ist der Unterschied zwischen pkill und killall?

49

Ich weiß, dass pkilles mehr Filterregeln als gibt killall. Meine Frage ist, was ist der Unterschied zwischen:

pkill [signal] name

und

killall [signal] name

Ich habe gelesen, dass dies killalleffektiver ist und alle Prozesse und Unterprozesse (und rekursiv) beendet, die mit dem nameProgramm übereinstimmen . pkillmacht das nicht auch

Mavillan
quelle

Antworten:

46

Die Dienstprogramme pgrepund pkillwurden in Solaris 7 von Sun eingeführt und verwenden, wie g33klord feststellte , ein Muster als Argument, das mit den Namen der ausgeführten Prozesse abgeglichen wird. Während pgreplediglich eine Liste übereinstimmender Prozesse gedruckt wird, pkillwird das angegebene Signal (oder SIGTERMstandardmäßig) an die Prozesse gesendet . Die gemeinsamen Optionen und Semantiken zwischen pgrepund sind pkillnützlich, wenn Sie vorsichtig sein und zuerst die Prozesse für den Listenabgleich mit überprüfen pgrepund dann mit beenden möchten pkill. pgrepund pkillwerden durch die die zur Verfügung gestellten procps Paket, das auch andere bietet /procDateisystemdienstprogramme, wie zum Beispiel ps, top, free, uptimeunter anderem.

Der killallBefehl wird vom psmisc- Paket bereitgestellt und unterscheidet sich pkilldarin, dass er standardmäßig genau mit dem Argumentnamen übereinstimmt (bis zu den ersten 15 Zeichen), wenn festgelegt wird, an welche Prozesse Signale gesendet werden. Die -e, --exactOption kann auch angegeben werden , um für Namen exakte Übereinstimmungen benötigen länger als 15 Zeichen. Dies macht die Verwendung killalletwas sicherer als pkill. Wenn das angegebene Argument Schrägstriche ( /) enthält , wird das Argument als Dateiname interpretiert und Prozesse, die diese bestimmte Datei ausführen, werden als Signalempfänger ausgewählt. killallunterstützt auch reguläre Ausdrücke von Prozessnamen, über die -r, --regexpOption.

Es gibt auch andere Unterschiede. Der killallBefehl verfügt beispielsweise über Optionen zum Abgleichen von Prozessen nach Alter ( -o, --older-thanund -y, --younger-than), während festgelegt werden pkillkann, dass nur Prozesse auf einem bestimmten Terminal abgebrochen werden sollen (über die -tOption). Es ist klar, dass die beiden Befehle bestimmte Nischen haben.

Beachten Sie, dass der killallBefehl auf Systemen, die von Unix System V abstammen (insbesondere Solaris von Sun , AIX von IBM und HP-UX von HP ), alle Prozesse beendet, die von einem bestimmten Benutzer beendet werden können, und das System effektiv herunterfährt, wenn es von root ausgeführt wird.

Die Linux-Dienstprogramme psmisc wurden auf BSD (und in der Erweiterung Mac OS X ) portiert , daher killallfolgt die Semantik "Kill-Prozesse nach Namen".

Thomas Nyman
quelle
Der Hauptunterschied, auf den ich gestoßen bin, ist das Stoppen von Befehlen eines Musters durch einen Benutzer killall -u <username> -r <process>oder pkill <process> -U <uid>was die killallVerwendung für mich erheblich erleichtert.
jeremysprofile
13

pkillist diejenige, die es wert ist, zukünftige Generationen zu unterrichten, sowohl aufgrund der von Ihnen erwähnten Filter als auch aufgrund der Tatsache, dass sie mit den hochgradig wiederverwendbaren Filtern gepaart sind pgrep. Sie beenden Prozesse auf die gleiche Weise und beenden sie auch nicht rekursiv. Mit pgrepkönnen Sie jedoch nach Sitzung (Per-tty, think setsid) oder Prozessgruppe (think job control) auswählen.

Gabriel
quelle
8

Ein Unterschied besteht darin, dass killallder genaue Name des Prozesses als Argument verwendet wird, während der pkillName teilweise oder vollständig sein kann.

Sie können diese Frage ansprechen, um mehr über pkill zu erfahren

Elektropoet
quelle
1

killall- Prozesse namentlich beenden. Verwenden Sie den killallBefehl, um ein Signal an einen oder mehrere Prozesse zu senden, die den Auswahlkriterien entsprechen, z. B. Befehlsname, Prozesse eines bestimmten Benutzers oder alle systemweiten Prozesse.

pkill- sendet das angegebene Signal (standardmäßig SIGTERM) an jeden Prozess, anstatt sie auf stdout aufzulisten. pkillkann mehrere Prozesse wie signalisieren killall, kann aber auch erweiterte Auswahlkriterien verwenden, die eine beliebige Kombination von:

Befehl UID Parent Terminal

user196507
quelle