Meine Antwort ist eine Variation der typischen Antwort für die Suche nach "foobar" in einer "ps" -Auflistung. Ich glaube, das Argument "-A" "ps" ist portabler als "aux", 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 eine statische Zeichenfolge "[^]]" mit dem gewünschten Muster verketten. 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, "[^]]" vor das gesuchte Muster zu kleben. 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önnen also einen portablen Befehl 'psgrep' wie folgt schreiben. Hier berücksichtige ich einige Unterschiede zwischen Linux, OS X BSD und anderen. Dies fügt die Spaltenüberschriften von 'ps' hinzu, stellt ein benutzerdefinierteres 'ps'-Format bereit, das meinen Anforderungen entspricht, und zeigt Prozesse an, die eine zusätzliche Breite aufweisen, 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, sind der Befehlsname und die Argumentliste nicht mehr vorhanden.
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
}
ps aux |grep
mitpgrep
(oderpgrep -f
).