Meine Antwort ist eine Variation der typischen Antwort für die Suche nach "foobar" in einer ps
Auflistung. Das Argument von "-A" "ps"
ist tragbarer als "aux"
, glaube ich, aber diese Änderung ist für die Antwort irrelevant. Die typische Antwort sieht so aus:
$ ps -A -ww | grep [f]oobar
Stattdessen benutze ich dieses Muster:
$ ps -A -ww | grep [^]]foobar
Der Hauptvorteil ist, dass es einfacher ist, Skripte basierend auf diesen Mustern zu schreiben, da Sie einfach einen statischen String [^]]
mit dem Muster verketten , nach dem Sie suchen. Sie müssen den ersten Buchstaben der Zeichenfolge nicht abstreifen, ihn dann zwischen die eckigen Klammern einfügen und ihn dann wieder zusammenfügen. Wenn [^]]
Sie Skripte in der Shell schreiben, ist es einfacher, einfach vor dem Muster zu bleiben, nach dem Sie gesucht haben. Das Aufschneiden von Saiten in Bash ist eine hässliche Sache, also vermeidet meine Variante das. Diese Variante besagt, dass die Linien angezeigt werden, in denen das Muster OHNE führende eckige Klammer stimmt. Da das Suchmuster zum Ausschließen einer eckigen Klammer tatsächlich die eckige Klammer zum Muster hinzufügt, entspricht es sich selbst nie.
Sie könnten also einen portablen psgrep
Befehl wie folgt schreiben . Hier berücksichtige ich einige Unterschiede zwischen Linux, OS X BSD und anderen. Dies fügt die Spaltenüberschriften aus ps
, bietet eine benutzerdefinierteps
Das Format, das meinen Anforderungen entspricht, ist besser geeignet und zeigt Prozesse an, in denen eine zusätzliche, besonders breite Liste aufgeführt ist, sodass keines der Befehlszeilenargumente übersehen wird. Nun, die meisten werden nicht vermisst. Da Java Java ist, werden die Dinge oft auf die schlimmste Art und Weise ausgeführt, sodass einige Java-Services über die maximal zulässige Länge von Argumenten ausgeführt werden, die in der Prozesstabelle aufgezeichnet werden. Ich glaube das sind 1024 Zeichen. Die befehlsübergreifende Länge, die zum Starten eines Prozesses zulässig ist, ist viel länger, aber die Kernel-Prozesstabelle kümmert sich nicht darum, etwas über 1 KB Länge zu verfolgen. Sobald der Befehl gestartet ist, werden der Befehlsname und die Argumentliste nicht mehr benötigt. Was also in der Prozesstabelle gespeichert wird, dient nur der Information.
psgrep ()
{
pattern=[^]]${1};
case "$(uname -s)" in
Darwin)
ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
Linux)
ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
*) # other UNIX flavors get a minimalist version.
ps -A -ww | grep -i -e ${pattern}
;;
esac
}
grep --colour
.