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:
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):
und hier die variante die funktioniert:
Eigentlich erscheint es ja recht einfach, und klappt meistens auch:
Code:
RunTime rt=Runtige.getRuntime();
Process p=rt.exec("Shell Befehl");
p.waitFor();
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();
}
}
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();
}
}