GNU/Linux >> LINUX-Kenntnisse >  >> Linux

killall gibt mir "no process found", aber ps

Ist das unter Linux?

Es gibt tatsächlich ein paar subtil unterschiedliche Versionen des Befehlsnamens, die von ps verwendet werden , killall usw.

Die beiden Hauptvarianten sind:1) der lange Befehlsname, den Sie erhalten, wenn Sie ps u ausführen; und 2) den kurzen Befehlsnamen, den Sie erhalten, wenn Sie ps ausführen ohne Flaggen.

Der wahrscheinlich größte Unterschied tritt auf, wenn Ihr Programm ein Shell-Skript ist oder irgendetwas, das einen Interpreter erfordert, z. Python, Java usw.

Hier ist ein wirklich triviales Skript, das den Unterschied demonstriert. Ich habe es mycat genannt :

#!/bin/sh
cat

Nach dem Ausführen sind hier die zwei verschiedenen 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, dass die zweite Version mit /bin/sh beginnt ?

Nun, soweit ich das beurteilen kann, killall lautet eigentlich /proc/<pid>/stat , und nimmt das zweite Wort zwischen den Klammern als Befehlsnamen, also müssen Sie das wirklich angeben, wenn Sie killall ausführen . Logischerweise sollte das dasselbe sein wie ps ohne u Flag sagt, aber es wäre eine gute Idee, dies zu überprüfen.

Zu überprüfende Dinge:

  1. was bedeutet cat /proc/<pid>/stat sagen wir, der Befehlsname ist?
  2. was bedeutet ps -e | grep db2 sagen wir, der Befehlsname ist?
  3. tue ps -e | grep db2 und ps au | grep db2 denselben Befehlsnamen anzeigen?

Notizen

Wenn Sie auch andere PS-Flags verwenden, finden Sie es möglicherweise einfacher, ps -o comm zu verwenden um den Kurznamen und ps -o cmd zu sehen um den langen Namen zu sehen.

Möglicherweise finden Sie auch pkill eine bessere Alternative. Insbesondere pkill -f versucht einen Abgleich mit dem vollständigen Befehlsnamen, d. h. dem Befehlsnamen, wie er durch ps u gedruckt wird oder ps -o cmd .


killall versucht, auf einen Prozessnamen zu passen (aber ist nicht wirklich gut im passenden Teil).

Und da "ps | grep" und "ps | grep | kill" viel besser funktionieren, hat jemand dies vereinfacht und pgrep und pkill erstellt. Lesen Sie diese Befehle wie "ps grep" und "ps kill", da dieser Befehl zuerst ps dann grep und wenn gewünscht kills.


Ich hatte ein ähnliches Problem, aber /proc/<pid>/stat enthielt die erwartete Zeichenfolge. Durch die Verwendung von strace konnte ich sehen, dass killall auch auf /proc/<pid>/cmdline zugegriffen hat .

Ich habe die Verwendung von gdb weiter untersucht, um festzustellen, dass es in meinem Fall bei einer Überprüfung meines Befehls auf den vollständigen Befehl einschließlich aller in /proc/<pid>/cmdline gefundenen Argumente fehlgeschlagen ist . Es schien, als ob dieser Pfad des Codes ausgelöst wurde, weil der Dateiname länger als 15 Zeichen war (was ein hartcodierter Wert in der Quelle von killall ist). Ich habe nicht vollständig nachgeforscht, ob ich es irgendwie mit Killall zum Laufen bringen könnte.

Aber wie in anderen Kommentaren hier erwähnt, ist pkill eine bessere Alternative, die nicht die gleichen Probleme hat.

Der Quellcode von pkill finden Interessierte hier https://github.com/acg/psmisc.


Linux
  1. Subscription-Manager:Befehl nicht gefunden

  2. id:Befehl nicht gefunden

  3. w:Befehl nicht gefunden

  4. df:Befehl nicht gefunden

  5. du:Befehl nicht gefunden

Pstree-Befehl unter Linux

Kill-Befehl unter Linux

Killall-Befehl in Linux mit Beispielen

Befehl nicht in Zsh, aber in Bash gefunden?

nc:Befehl nicht gefunden

aws-shell:Befehl nicht gefunden