Wie ermittle ich unter Linux die Anzahl der Prozesse, deren Prozesstitel irgendwo die exakte Zeichenfolge „test test 123“ enthält?

Wie ermittle ich unter Linux die Anzahl der Prozesse, deren Prozesstitel irgendwo die exakte Zeichenfolge „test test 123“ enthält?

Unter Windows habe ich das bereits herausgefunden, aber wie es unter Linux geht, ist mir ein Rätsel:

tasklist /V /NH | find "test test 123"

Und dann zähle ich die Anzahl der nicht leeren Zeilen in der Ausgabe. Das ist super langsam, funktioniert aber. Jetzt suche ich nach der Linux-Methode, um dasselbe zu tun.

Das heißt, „Test Test 123“ kann der vollständige Prozesstitel sein, er kann damit beginnen, er kann damit enden oder er kann einfach in der Mitte stehen. Das ist wichtig.

Antwort1

Kurz zusammengefasst: verwendenpgrep -cf "test test 123"


Das psProgramm listet alle laufenden Prozesse auf. Versuchen Sie insbesondere:

ps aux 

Jetzt können Sie die Liste einfach filtern, um grepnach Ihrer Zeichenfolge zu suchen:

ps aux | grep "test test 123"

Dadurch werden übereinstimmende Zeilen ausgedruckt. Um sie zu zählen, verwenden Sie grep -cstattdessen which, das die Anzahl der übereinstimmenden Zeilen ausgibt:

ps aux | grep -c "test test 123"

Das Problem bei diesem Ansatz ist, dass der grepoben beschriebene Prozess auch in den Ergebnissen angezeigt wird. Ich bearbeite beispielsweise gerade eine Datei mit dem Namen test test 123, aber wenn ich den obigen Befehl ausführe, sehe ich sowohl den Prozess meines Dateieditors als auch den grepselbst:

$ ps aux | grep  "test test 123"
terdon   2461453 22.0  0.2 392944 79796 pts/1    Sl   15:53   0:02 emacs test test 123
terdon   2462354  0.0  0.0   8832  2292 pts/1    S+   15:53   0:00 grep --color test test 123

Daher wird anstelle von Folgendes grep -czurückgegeben :21

$ ps aux | grep -c "test test 123"
2

Damit kommen wir zum richtigen Werkzeug für diese Aufgabe pgrep. Dieses Werkzeug wurde speziell dafür entwickelt, Prozesse zu finden:

$ pgrep -cf "test test 123"
1

Das -cbedeutet „Übereinstimmungen zählen“ und das -fbedeutet „die gesamte Befehlszeile durchsuchen, nicht nur den Prozessnamen“.

Der andere gängige Trick zum Überspringen des grepselbst besteht darin, anstelle derselben Zeichenfolge eine einstellige Zeichenklasse zu verwenden, sodass die grepBefehlszeile die Zeichenfolge nicht enthält:

$ ps aux | grep  "test test 123"
terdon   2461453  1.2  0.2 392944 79796 pts/1    Sl   15:53   0:02 emacs test test 123
terdon   2476971  0.0  0.0   8832  2236 pts/1    S+   15:56   0:00 grep --color test test 123
$ ps aux | grep  "[t]est test 123"
terdon   2461453  1.2  0.2 392944 79796 pts/1    Sl   15:53   0:02 emacs test test 123
$ ps aux | grep -c "[t]est test 123"
1

Weitere Informationen zu diesem Trick finden Sie unterHier. Aber das ist wirklich nicht notwendig, wenn Ihr System über pgrepdie gleichen Eigenschaften wie Linux-Systeme verfügt.

Antwort2

echo $(( $(ps aux | grep "test test 123" | wc -l) - 1))

sollte zum Trick

verwandte Informationen