Shell Befehle mit Java aufrufen

Status
Nicht offen für weitere Antworten.

Katzwinkel

Mitglied
Ich habe ein Problem mit dem Aufrufen von Bash-Shell-Befehlen aus einem Java-Programm heraus.
Eigentlich erscheint es ja recht einfach, und klappt meistens auch:
Code:
RunTime rt=Runtige.getRuntime();
    Process p=rt.exec("Shell Befehl");
    p.waitFor();
Bei manchen Shell Befehlen scheint das Programm dann allerdings ewig auf das ende des Prozesses zu warten(Sprich: Es reagiert überhauptnicht mehr; in meinem Fall beim Aufruf des Programms gcphrap) obwohl der Prozess, wenn über die Shell aufgerufen, eigentlich nur wenige sekunden dauert.
Und was mich besonders verwirrt, der einfache "cat"-Befehl wird auf diese weise garnicht ausgeführt. Ich erhalte keine Fehlermeldung, der Rest des Programms läuft auch einwandfrei aber der cat-Befehl scheint einfach ignoriert worden zu sein. Lösen konnte ich das problem nur indem ich statt p.waitFor() Thread.sleep(2000) eingesetzt habe. Das erscheint mir aber extrem unlogisch und unschön. Kann mir jemand sagen woran das liegt?

hier mein versuch die Shell-Befehle aufzurufen der nicht klappt(obwohl es bei anderen Shell befehlen klappt):
Code:
public static void machfofn(String datei, File verz){

		System.out.println("fuehre gcphrap aus fuer Contig ./"+verz+"/"+datei+"...");
		Runtime rt = Runtime.getRuntime();
		try{
			Process p=rt.exec("gcphrap -exp ./"+verz+" -minmatch 20 ./"+verz+"/"+datei);
			p.waitFor();
			System.out.println("OK");
		}
		catch(Exception ex){
			System.out.println("gescheitert");
			ex.printStackTrace();
		}
		try{
			System.out.println("fuege exp-Liste zu fofn hinzu");
			System.out.println("cat ./"+verz+"/"+datei+".ph >>./"+verz+"/fofn");
			Process p=rt.exec("cat ./"+verz+"/"+datei+".ph >>./"+verz+"/fofn");
			p.waitFor();
			
		}
		catch(Exception ex){
			System.out.println("Fehler beim zusammenfuegen der fofn-Datei");
			ex.printStackTrace();
		}
	}
und hier die variante die funktioniert:
Code:
public static void machfofn(String datei, File verz){

		System.out.println("fuehre gcphrap aus fuer Contig ./"+verz+"/"+datei+"...");
		Runtime rt = Runtime.getRuntime();
		try{
			rt.exec("gcphrap -exp ./"+verz+" -minmatch 20 ./"+verz+"/"+datei);
			Thread.sleep(40000);
			System.out.println("OK");
		}
		catch(Exception ex){
			System.out.println("gescheitert");
			ex.printStackTrace();
		}
		try{
			System.out.println("fuege exp-Liste zu fofn hinzu");
			System.out.println("cat ./"+verz+"/"+datei+".ph >>./"+verz+"/fofn");
			rt.exec("cat ./"+verz+"/"+datei+".ph >>./"+verz+"/fofn");
			Thread.sleep(10000);
			
		}
		catch(Exception ex){
			System.out.println("Fehler beim zusammenfuegen der fofn-Datei");
			ex.printStackTrace();
		}
	}
 

Ebenius

Top Contributor
Du musst Dir vom Prozess stdout und stderr holen und auslesen. Wenn Beispielsweise "cat" seine Ausgabe macht, schreibt es in den stdout bis der Puffer voll ist. Danach wartet es, bis der Puffer wieder Platz hat. Das passiert aber nie, da ja keine Konsole den Strom ausliest. Also muss das Dein Programm machen.

[ edit ] Alternativ kannst Du natürlich auch alle Befehle mit "2>&1 > /dev/null" aufrufen oder ähnliches.

Verstanden?
 

Katzwinkel

Mitglied
Danke, daran wirds liegen. Nur wie mach ich das am besten? (Bin echt noch totaler Anfänger im Programmieren).
Könnt das so aussehen:
Code:
BufferedWriter buf = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
buf.flush()
Wie mache ich es wenn ich den inhalt des Puffers in eine art Log-Datei schreiben möchte?
Dann muesste ich doch den BufferedWriter der bereits mit dem OutputStreamwriter verkettet ist noch mit einem FileWriter veketten oder?
[/code]
 

Katzwinkel

Mitglied
im fall des cat befehls habe ich doch stdout berits umgeleitet oder? mein Befehl lautet ja vereinfacht:
cat Datei >>fofn-Datei
Wie kann da Ausgabe den Puffer blockieren? Oder ist der Puffer vielleicht durch die Ausgaben der vorher aufgerufenen Shell-Befehle blockiert und muss geflusht werden noch bevor ich den cat-Befehl aufrufe?
 

Ebenius

Top Contributor
Katzwinkel hat gesagt.:
im fall des cat befehls habe ich doch stdout berits umgeleitet oder? mein Befehl lautet ja vereinfacht:
cat Datei >>fofn-Datei
Wie kann da Ausgabe den Puffer blockieren? Oder ist der Puffer vielleicht durch die Ausgaben der vorher aufgerufenen Shell-Befehle blockiert und muss geflusht werden noch bevor ich den cat-Befehl aufrufe?
Weiß ich auch nicht recht. Aber versuch doch erstmal bei allen Aufrufen stdout und stderr nach /dev/null zu leiten. Dann teste nochmal, ob's hängen bleibt. Wenn's immer noch hängen bleibt, gibt's noch nen anderen Fehler.

Ebenius
 

Ebenius

Top Contributor
Katzwinkel hat gesagt.:
Danke, daran wirds liegen. Nur wie mach ich das am besten? (Bin echt noch totaler Anfänger im Programmieren).
Könnt das so aussehen:
Code:
BufferedWriter buf = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
buf.flush()
Wie mache ich es wenn ich den inhalt des Puffers in eine art Log-Datei schreiben möchte?
Dann muesste ich doch den BufferedWriter der bereits mit dem OutputStreamwriter verkettet ist noch mit einem FileWriter veketten oder?
[/code]

Da hast Du einen Denkfehler. Process.getOutputStream() gibt dir stdin. stdout bekommst Du mit Process.getInputStream() und stderr bekommst Du mit Process.getErrorStream(). Klingt logisch, wenn man darüber nachdenkt (obwohl die Benennung trotzdem besser sein könnte).

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Shell Script ausführen Java Basics - Anfänger-Themen 5
L Shell Script ausführen in Java Java Basics - Anfänger-Themen 4
E Shell: Hauptklasse konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 3
A Erste Schritte Programm in Shell mit bestimmter Java-Version aufrufen Java Basics - Anfänger-Themen 10
H Shell Command, im Hintergrund Java Basics - Anfänger-Themen 2
P ein Java Script mit Shell/Bash launchen? Ubuntu Java Basics - Anfänger-Themen 3
K Befehl per Shell an Java-Applet JAR übergeben Java Basics - Anfänger-Themen 16
L SHELL-Scripte als root ausführen Java Basics - Anfänger-Themen 5
A Shell erfolgreich verlaufen oder Fehler gehabt Java Basics - Anfänger-Themen 4
T Shell Script Aufruf mit Java Java Basics - Anfänger-Themen 7
S javac - Rückgabewerte an die Shell Java Basics - Anfänger-Themen 10
S Shell zeigt keine Scrollbars Java Basics - Anfänger-Themen 2
M shell als Typ auflösen Java Basics - Anfänger-Themen 12
G java shell script starten und befehl übergeben Java Basics - Anfänger-Themen 3
G Unix Shell Subroutine ausfuehren Java Basics - Anfänger-Themen 3
O Java- File in Shell/Terminal/etc. öffnen Java Basics - Anfänger-Themen 8
S Shell Script ausführen unter Java Java Basics - Anfänger-Themen 5
K Java-Programm mittels Shell-Skript aufrufen Java Basics - Anfänger-Themen 3
C Windows Shell mit JAVA öffnen Java Basics - Anfänger-Themen 12
T Sortierte Ausgabe in der Shell Java Basics - Anfänger-Themen 4
S Shell-Skripte per Java aufrufen? Java Basics - Anfänger-Themen 5
RudiRüssel Befehle - Maschinenprogramme Java Basics - Anfänger-Themen 6
H Befehle in einem Menü aktivieren Java Basics - Anfänger-Themen 1
D import Befehle Java Basics - Anfänger-Themen 3
F Linux Befehle zum Übersetzen Java Basics - Anfänger-Themen 1
L Linux Befehle unter Windows in Eclipse ausführen Java Basics - Anfänger-Themen 3
D Erste Schritte Weitere Befehle implementieren Java Basics - Anfänger-Themen 27
T befehle unterschiedlicher anzahl an strings wiedergeben Java Basics - Anfänger-Themen 2
RowdyN Methoden Befehle in zufälliger Reihenfolge ausführen lassen Java Basics - Anfänger-Themen 5
D Input/Output Mehrere Befehle nacheinander ausführen Java Basics - Anfänger-Themen 20
L Text/Befehle zu Programmen senden Java Basics - Anfänger-Themen 1
C Java und "normale" Befehle Java Basics - Anfänger-Themen 3
M Input/Output Allg. Befehle an die cmd.exe senden Java Basics - Anfänger-Themen 9
N Mit Java Befehle auf Konsole ausführen Java Basics - Anfänger-Themen 4
F alle 100ms Befehle ausführen Java Basics - Anfänger-Themen 26
S Befehle in ProcessBuilder nachschieben Java Basics - Anfänger-Themen 2
J Befehle aus anderen Klassen ausführen Java Basics - Anfänger-Themen 8
F Befehle von Java class ausführen Java Basics - Anfänger-Themen 3
F Befehle wiederholen Java Basics - Anfänger-Themen 7
B Threads Geschwindigkeit der Befehle auf verschiedenen PCs gleich machen Java Basics - Anfänger-Themen 3
G Kombination zweier Befehle (Preis festlegen & Rabatt berechnen) Java Basics - Anfänger-Themen 3
D Input/Output Stringbuffer Befehle bei Konvertierung in String Java Basics - Anfänger-Themen 19
C Nach Java-Installation sind Befehle erfolglos Java Basics - Anfänger-Themen 4
J Unklare Befehle Java Basics - Anfänger-Themen 4
K .bat Dateien starten, Ausgabe einlesen und Befehle übergeben Java Basics - Anfänger-Themen 32
H Befehle an andere Programme Java Basics - Anfänger-Themen 8
M Befehle der Eingabeaufforderung Java Basics - Anfänger-Themen 2
S return(Bedingung) ? [mehrere Befehle] Java Basics - Anfänger-Themen 5
M Umgebungsvariable gesetzt, aber nicht alle Befehle ausführbar Java Basics - Anfänger-Themen 6
M TextWrangler/VIM- Manche Befehle werden nicht farblich hervorgehoben Java Basics - Anfänger-Themen 3
S Mehrere Return-Befehle in einer Methode Java Basics - Anfänger-Themen 23
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
N 2 Befehle zu einem machen Java Basics - Anfänger-Themen 10
G CMD Befehle übergeben Java Basics - Anfänger-Themen 2
J Java Konsolenprogramm Befehle(Optionen) übergeben Java Basics - Anfänger-Themen 7
Blackskyliner Befehle an einen Thread senden? Java Basics - Anfänger-Themen 2
K Wieviele Befehle pro .java Datei Java Basics - Anfänger-Themen 4
C Befehle finden / Befehle richtig suchen Java Basics - Anfänger-Themen 5
E Befehle Java Basics - Anfänger-Themen 3
D MS Dos Befehle mit java Java Basics - Anfänger-Themen 3
G Falsche Java befehle, doch was ist falsch? Java Basics - Anfänger-Themen 9
D Win98 erkennt keine java Befehle.Umgebungsvariablen falsch? Java Basics - Anfänger-Themen 7
B Alt-Befehle Java Basics - Anfänger-Themen 4
C System.exit(int) und andere ähnliche Befehle Java Basics - Anfänger-Themen 5
R MS-DOS-Befehle ausführen Java Basics - Anfänger-Themen 11
S Befehle an externe Programme Java Basics - Anfänger-Themen 4
L Dos Befehle via Java Java Basics - Anfänger-Themen 4
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben