killall gibt mir `no process found` aber ps

17

Könnte mir jemand den Unterschied zwischen killund erklären killall? Warum sieht man nicht killallwas pszeigt?

# 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

Radek
quelle
Beenden Sie niemals Prozesse mit SIGKILL (-9).
Vonbrand
Was tun, wenn ein Prozess beendet werden muss?
Radek
Dies ist der allerletzte Ausweg.
Vonbrand

Antworten:

19

Geht das unter Linux?

Es gibt tatsächlich ein paar subtile Weise verschiedene Versionen des Befehlsnamen , die durch verwendet werden ps, killallusw.

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 Sie psohne 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:

#!/bin/sh
cat

Nach dem Ausführen gibt es zwei verschiedene Arten von ps.

Erstens ohne u:

$ ps -p 5290
  PID TTY      ... CMD
 5290 pts/6    ... mycat

Zweitens mit u:

$ ps u 5290
USER       PID ... COMMAND
mikel     5290 ... /bin/sh /home/mikel/bin/mycat

Beachten Sie, wie die zweite Version beginnt mit /bin/sh?

Nun, soweit ich das beurteilen kann, killallliest /proc/<pid>/statund fasst das zweite Wort zwischen den Parens als Befehlsname zusammen. Das ist also genau das, was Sie beim Ausführen angeben müssen killall. Logischerweise sollte das dasselbe sein wie psohne die uFlagge, aber es wäre eine gute Idee, dies zu überprüfen.

Dinge zu überprüfen:

  1. Wie cat /proc/<pid>/statlautet der Befehlsname?
  2. Wie ps -e | grep db2lautet der Befehlsname?
  3. tun ps -e | grep db2und ps au | grep db2zeigen den gleichen Befehlsnamen?

Anmerkungen

Wenn Sie auch andere ps-Flags verwenden, ist es möglicherweise einfacher, ps -o commden Kurznamen und ps -o cmdden Langnamen anzuzeigen.

Sie könnten auch pkilleine bessere Alternative finden. Insbesondere wird pkill -fversucht, den vollständigen Befehlsnamen zu verwenden, dh den Befehlsnamen, wie er von ps uoder gedruckt wird ps -o cmd.

Mikel
quelle
sehr gute erklärung. Und ich denke, du hattest beim ersten Mal recht. ps -e |grep db2 gives me 3084? 00:00:00 db2syscr` und ps aux | grep db2 geben mir root 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd. Könnte das kommentieren. Ich bin etwas verloren.
Radek
Ich bin mir nicht sicher. Möglicherweise ändert das Programm seinen Namen. Weißt du, wie es läuft? Was ls -l /proc/3084/exeheißt das? Was ist mit whichoder whenceoder typeum die Datei zu finden und dann lsund um typezu sehen, ob es ein Symlink oder ein Skript oder eine Binärdatei ist?
Mikel
ls -l / proc / 3084 / exe gibt unslrwxrwxrwx 1 root root 0 Jun 6 16:49 /proc/3084/exe -> /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek
ls -l / var / lib / db2 / db2inst1 / sqllib / adm / db2syscr gibt mir-r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr*
Radek
Typ gibt mir / var / lib / db2 / db2inst1 / sqllib / adm / db2syscr/var/lib/db2/db2inst1/sqllib/adm/db2syscr is /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek
6

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.

Johan
quelle
2

Ich hatte ein ähnliches Problem, /proc/<pid>/statenthielt 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 pkillfinden Interessierte hier https://github.com/acg/psmisc .

Zitrax
quelle
0

Auf Ubuntu 16-Systemen enthält / proc / pid / stat den Namen des Threads (den ein Programm über den Systemaufruf pthread_setname_np aufrufen kann).

gerardw
quelle