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
.+1 für @jamzed knappe Antwort, jedoch muss das OP möglicherweise erklärt werden:
Mit diesem regulären Ausdruck starten Sie einen Prozess, dessen ps-Zeichenfolge nicht mit sich selbst übereinstimmt, da der reguläre Ausdruck übereinstimmt
"django"
und nicht"[d]jango"
. Auf diese Weise schließen Sie den Prozess mit der Zeichenfolge "[d] jango" aus, in diesem Fall grep. Dasselbe gilt für pgrep, egrep, awk, sed usw., je nachdem, mit welchem Befehl Sie die Regex definiert haben.Von Mann 7 Regex
quelle
ps aux | grep [s]cript1
. Können Sie uns helfen, die Lösung zu kommentieren?ps | grep [d]jango
ps | grep d[j]ango
...
ps | grep djang[o]
quelle
ps aux| grep "[Z] "
ps aux | grep [s]cript1
oderps aux | grep [s]cript2
. Die grep-Linie wird weiterhin angezeigt. Können Sie uns helfen, die Lösung zu kommentieren?Verwenden Sie stattdessen pgrep:
pgrep -lf django
quelle
pgrep
es mir genau dieses Problem gibt. Aber ich muss sagen, dass ich es in CygWin teste (wops
nicht die vollständige Befehlszeile des Prozesses angezeigt werden kann).pgrep
es zu mir passt. Es stellte sich heraus, dass es mit dem Namen derbash
Skriptdatei übereinstimmte, von der aus ich es ausgeführt habe. Durch Hinzufügen von-x
fixed it wird eine exakte Übereinstimmung mit dem Befehlsnamen hergestellt.Oh warte, das funktioniert:
quelle
grep
, worauf Sie im allgemeinen Fall nicht zählen können.ps -d | grep django
von mann ps:
quelle
ps
notorisch nicht portierbar. Ohne Informationen darüber, für welche Plattform dies ist, ist diese Antwort nicht sehr hilfreich. Darüber hinaus ist dies offensichtlich nicht ausreichend, wenn Sie nicht sicher sind, ob der gesuchte Prozess kein Prozessleiter ist (dh dies kann hilfreich sein, wenn Ihr Ziel ein Daemon ist, aber nicht generell anders).