Grep über .getRuntime

mysticado

Aktives Mitglied
Hallo,
ich möchte in meiner Java-Klasse einen "ps -aux | grep java" Befehl ausführen, doch anscheinend kommt es am senkrechten Strich nicht vorbei, sprich mein Ergebnis liefert mir nichts zurück. Hier mein Code, vielleicht weiss jemand von euch wieso ich nichts zurückbekomme?

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {

	public static void main(String[] args) throws IOException {
		String line = null;
		Process p3 = Runtime.getRuntime().exec("ps -aux \\| grep java");
		BufferedReader br3 = new BufferedReader(new InputStreamReader(p3
				.getInputStream()));
		while((line=br3.readLine()) != null){
			System.out.println("Result: "+line);
		}
	}
}
 
Die Pipe ist bei der Shell, Bash etc. bekannt. D.h. du musst diesen Befehl auch über eine solche Shell starten.
So funktionierts:
[c]bash -c "ps aux | grep java"[/c]
 
allgemein:
p3 bietet auch einen ErrorStream, vielleicht steht dort was drin

evtl. kompliziert aus beiden gleichzeitig zu lesen, im Testfall kann man ja auch einfach wechseln,
falls es nicht so kritisch abläuft dass im einen erst was geschrieben wird wenn das andere gelesen wurde usw..
 
Die Pipe ist bei der Shell, Bash etc. bekannt. D.h. du musst diesen Befehl auch über eine solche Shell starten.
So funktionierts:
[c]bash -c "ps aux | grep java"[/c]

Hmm, komisch! Bisher haben alle anderen Kommandos aber auch funktioniert. Na wie auch immer...ich habs jetzt probiert mit:

Java:
Process p3 = Runtime.getRuntime().exec("/bin/bash -c \"ps -aux \\| grep java\"");

doch das will immer noch nicht 🙁
Was nun? Was mach ich falsch?
 
Zuletzt bearbeitet von einem Moderator:
Hmm, komisch! Bisher haben alle anderen Kommandos aber auch funktioniert. [...]

Die Pipe ist kein Kommando sondern ein Feature gewisser Shells 😉

[c]Process p3 = Runtime.getRuntime().exec("/bin/bash -c \"ps -aux \\| grep java\"");[/c]

Warum escapest du die Pipe?
Ansonsten müsstest du die Streams auslesen, um zu erkennen, was das Problem ist. Oder versuchs mit [c]exec(String, String[])[/c] o.ä.
 
die Anführungszeichen hast du doch vorgeschlagen?
durch die [ c ]-Tags war das Kommando etwas abgeschnitten, habe es im Original korrigiert
 
Okay Leute,
danke für die Hilfe, es funktioniert nun! Für alle die evtl. mal auf diesen Thread stoßen, hier auch die Lösung:

Java:
.exec(new String[] { "bash", "-c", "ps aux | grep " });

Thanks 🙂
 
Zuletzt bearbeitet von einem Moderator:
BT:

[c]Warning: bad ps syntax, perhaps a bogus '-'? [...][/c]

das sollte der Error-Stream ausgeben
 
ps aux (ohne -) ist korrekt..

Man könnte aber gleich "pidof <binary>" nutzen und somit auf die PID abfragen, weil manchmal der grep selbst gefunden wird und dann dieser gegreped wird..
 
ps aux (ohne -) ist korrekt..

Vorsicht: Mit oder ohne - ist ein Unterschied.

Note that "ps -aux" is distinct from "ps aux". The POSIX and UNIX
standards require that "ps -aux" print all processes owned by a user
named "x"

Wobei mich das Verhalten von ps schon oft irritert hat.

Code:
ps -elf
ist IMHO die kompatibelste Notation
 
ps aux (ohne -) ist korrekt..

Man könnte aber gleich "pidof <binary>" nutzen und somit auf die PID abfragen, weil manchmal der grep selbst gefunden wird und dann dieser gegreped wird..
In dem Fall bestünde noch die Möglichkeit, ein "| grep -v grep" anzuhängen, um das zu verhindern.
Code:
ps aux | grep java | grep -v grep
 

Zurück
Oben