Verwendung von Pipe Symbol durch exec in Java [duplizieren]

8

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:

%Vor%

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?

    
Vinesh 29.08.2011, 05:47
quelle

4 Antworten

5

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

enthalten

Ссылка

    
Brian Roach 29.08.2011, 05:53
quelle
16

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

    
Angel O'Sphere 12.09.2011 11:28
quelle
5
  1. 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.

  2. 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.

  3. 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%     
Bohemian 29.08.2011 06:30
quelle
0

Entschuldigung, ich weiß nicht, wie man Ergebnisse von einem Befehl zu einem anderen korrekt leitet, aber wenn alles, was Sie wollen, der Java-Prozess ist, kommt das JDK mit einem Programm namens jps , das genau das tut. Versuchen Sie Folgendes:

%Vor%     
Nate W. 29.08.2011 05:52
quelle

Tags und Links