Ich verwende den folgenden Code, um die Details aller Prozesse zu erhalten, die im System ausgeführt werden:
%Vor% Ich möchte ps aux
mit dem Pipe-Symbol nach unten filtern, damit ich folgendes benutze:
Es geht zum ErrorStream. Später bemerkte ich, dass das Pipe Symbol (|) als Bitwise inclusive OR Operator in Java verwendet wird. Also habe ich den umgekehrten Schrägstrich vor dem Pipe-Symbol wie folgt verwendet:
%Vor% Aber es geht wieder zum ErrorStream. Wie kann ich ps aux | grep java
durch exec in Java ausführen?
Die Pipe ist eine Shell-Funktion - Sie verwenden keine Shell, Sie führen einen Prozess aus ( ps
).
Aber warum sollten Sie das wirklich tun? Was Sie sagen, ist:
"führe ps aus, schicke dann seine Ausgabe an ein anderes Programm (grep) und lasse es extrahieren, was ich brauche"
Sie müssen nur das, was Sie wollen, aus der Ausgabe von ps
extrahieren. Verwenden Sie Matcher
und achten Sie nur auf die Zeilen, die java
von Ihrem InputStream
Nun, wenn Sie pipes im Process exec benutzen wollen, dann müssen Sie eine Shell wie bash starten und ps und grep in der Kommandozeile für diese Shell angeben:
%Vor%Versuche dies zu verstehen, was ich meine, dann benutze das:
%Vor%um zu verstehen, wie Sie Ihren java.runtime.Process einrichten müssen.
Ich habe es nicht versucht, aber ich nehme das an:
%Vor%Ich hoffe, das hilft; D
Sie müssen den Befehl von seinen Argumenten trennen, wenn Sie exec aufrufen, zB .exec(new String[] { "ps", "aux" })
( nicht exec("ps aux")
). Wenn Sie Argumente übergeben müssen, müssen Sie die String [] - Version aufrufen - das erste Element von String[]
ist der Befehl, der Rest sind die Argumente.
Sie müssen den Inhalt des Ausgabestreams des ersten Befehls an den Eingabestream des zweiten Befehls senden. Ich habe Apache commons IOUtils verwendet, um dies mit Leichtigkeit zu tun.
Sie müssen den Eingabestream des grep
-Aufrufs schließen, andernfalls bleibt er hängen und wartet auf das Ende der Eingabe.
Mit diesen Änderungen macht dieser Code, was Sie wollen:
%Vor%