Könnte mir jemand den Unterschied zwischen kill
und erklären killall
? Warum sieht man nicht killall
was ps
zeigt?
# ps aux |grep db2
root 1123 0.0 0.8 841300 33956 pts/1 Sl 11:48 0:00 db2wdog
db2inst1 1125 0.0 3.5 2879496 143616 pts/1 Sl 11:48 0:02 db2sysc
root 1126 0.0 0.6 579156 27840 pts/1 S 11:48 0:00 db2ckpwd
root 1127 0.0 0.6 579156 27828 pts/1 S 11:48 0:00 db2ckpwd
root 1128 0.0 0.6 579156 27828 pts/1 S 11:48 0:00 db2ckpwd
# killall db2ckpwd
db2ckpwd: no process found
# kill -9 1126
# kill -9 1127
# kill -9 1128
System ist SuSe 11.3 (64 Bit); Kernel 2.6.34-12; procps version 3.2.8; killall von PSmisc 22.7; kill from GNU coreutils 7.1
Antworten:
Geht das unter Linux?
Es gibt tatsächlich ein paar subtile Weise verschiedene Versionen des Befehlsnamen , die durch verwendet werden
ps
,killall
usw.Die zwei Hauptvarianten sind: 1) der lange Befehlsname, den Sie erhalten, wenn Sie ausführen
ps u
; und 2) den kurzen Befehlsnamen, den Sie erhalten, wenn Sieps
ohne Flags ausführen .Der wahrscheinlich größte Unterschied besteht darin, dass Ihr Programm ein Shell-Skript oder etwas ist, das einen Interpreter erfordert, z. B. Python, Java usw.
Hier ist ein wirklich triviales Skript, das den Unterschied demonstriert. Ich nannte es
mycat
:Nach dem Ausführen gibt es zwei verschiedene Arten von
ps
.Erstens ohne
u
:Zweitens mit
u
:Beachten Sie, wie die zweite Version beginnt mit
/bin/sh
?Nun, soweit ich das beurteilen kann,
killall
liest/proc/<pid>/stat
und fasst das zweite Wort zwischen den Parens als Befehlsname zusammen. Das ist also genau das, was Sie beim Ausführen angeben müssenkillall
. Logischerweise sollte das dasselbe sein wieps
ohne dieu
Flagge, aber es wäre eine gute Idee, dies zu überprüfen.Dinge zu überprüfen:
cat /proc/<pid>/stat
lautet der Befehlsname?ps -e | grep db2
lautet der Befehlsname?ps -e | grep db2
undps au | grep db2
zeigen den gleichen Befehlsnamen?Anmerkungen
Wenn Sie auch andere ps-Flags verwenden, ist es möglicherweise einfacher,
ps -o comm
den Kurznamen undps -o cmd
den Langnamen anzuzeigen.Sie könnten auch
pkill
eine bessere Alternative finden. Insbesondere wirdpkill -f
versucht, den vollständigen Befehlsnamen zu verwenden, dh den Befehlsnamen, wie er vonps u
oder gedruckt wirdps -o cmd
.quelle
ps -e |grep db2 gives me
3084? 00:00:00 db2syscr` und ps aux | grep db2 geben mirroot 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd
. Könnte das kommentieren. Ich bin etwas verloren.ls -l /proc/3084/exe
heißt das? Was ist mitwhich
oderwhence
odertype
um die Datei zu finden und dannls
und umtype
zu sehen, ob es ein Symlink oder ein Skript oder eine Binärdatei ist?lrwxrwxrwx 1 root root 0 Jun 6 16:49 /proc/3084/exe -> /var/lib/db2/db2inst1/sqllib/adm/db2syscr
-r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr*
/var/lib/db2/db2inst1/sqllib/adm/db2syscr is /var/lib/db2/db2inst1/sqllib/adm/db2syscr
killall versucht, einen Prozessnamen zuzuordnen (ist aber im übereinstimmenden Teil nicht so gut).
Und da "ps | grep" und "ps | grep | kill" viel besser funktionieren, hat dies jemand vereinfacht und pgrep und pkill erstellt. Lesen Sie, dass Befehle wie "ps grep" und "ps kill", da dieser Befehl zuerst ps grep und wenn gewünscht tötet.
quelle
Ich hatte ein ähnliches Problem,
/proc/<pid>/stat
enthielt aber die erwartete Zeichenfolge. Durch die Verwendung von strace konnte ich sehen, dass auch auf killall zugegriffen wurde/proc/<pid>/cmdline
.Ich recherchierte weiterhin mit gdb, um herauszufinden, dass in meinem Fall die Überprüfung meines Befehls bis zum vollständigen Befehl einschließlich aller in gefundenen Argumente fehlgeschlagen war
/proc/<pid>/cmdline
. Es schien, als ob dieser Pfad des Codes ausgelöst wurde, weil der Dateiname länger als 15 Zeichen war (was ein fest codierter Wert in der Quelle von killall ist). Ich habe nicht vollständig untersucht, ob ich es irgendwie schaffen kann, mit killall zusammenzuarbeiten.Aber wie in anderen Kommentaren erwähnt, ist pkill eine bessere Alternative, die nicht dieselben Probleme hat.
Den Quellcode von
pkill
finden Interessierte hier https://github.com/acg/psmisc .quelle
Auf Ubuntu 16-Systemen enthält / proc / pid / stat den Namen des Threads (den ein Programm über den Systemaufruf pthread_setname_np aufrufen kann).
quelle