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:
- was bedeutet
cat /proc/<pid>/stat
sagen wir, der Befehlsname ist? - was bedeutet
ps -e | grep db2
sagen wir, der Befehlsname ist? - tue
ps -e | grep db2
undps 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.