Runtime.getRuntime().exec(comand) --> Problem
Hi Leute,
ich versuche jetzt schon seit 24 Stunden folgendes hin zu bekommen.
Bitte helfe mir doch mal einer ...
Ausschnitt der Variablen Definition:
final static String device = "/dev/dvd";
final static String workingDir = "/hdisk/maxtor/rip/test_subtitle/";
static String p_name = "output_dvd";
**** SCHNIPP ******
if (getVideo) {
comand = "mkfifo " + workingDir + "vid1.fifo";
System.out.println ("excecuting comand: " + comand);
Process proc_v1 = Runtime.getRuntime().exec(comand);
proc_v1.waitFor();
comand = "tcextract -i " + workingDir + "vid1.fifo -t vob -x mpeg2 -a
0xe0 > " + workingDir + p_name + "_1.m2v";
System.out.println ("excecuting comand: " + comand);
Process proc_v1_1 = Runtime.getRuntime().exec(comand);
// Reader in = new InputStreamReader(proc_v1_1.getInputStream());
// Reader err = new InputStreamReader(proc_v1_1.getErrorStream());
// int ch_in, ch_err;
// while ((ch_in = in.read()) != -1) {
// System.out.write(ch_in);
// }
// while ((ch_err = err.read()) != -1)
// System.out.write(ch_in);
}
***** SCHNAPP ********
Also der 1. Befehl funktioniert (mkfifo). Aber beim zweiten funktioniert
es nicht. Wie Ihr oben seht, geben ich den Befehl der dort ausgeführt
werden soll auf der Kommandozeile aus. Wenn ich genau dieses in die
Shell einfüge, dann wird er richtig ausgeführt. Jedoch im Programm
leider nicht :-(.
Warum??
Sieht jemand von Euch den Fehler oder hat eine Idee? Denn ich habe keine
Ahnung mehr woran es noch liegen könnte.
tia
OLI
PS:
Wenn ich irgendwas von dem Auskommentierten wieder mit in den Quellcode
reinnehme, dann hält das Programm in der While-Schleife und wird nie
fertig ...
--
Tim Oliver Wagner
Moin moin, Am Wednesday 19 November 2003 18:06 schrieb Tim Oliver Wagner:
ich versuche jetzt schon seit 24 Stunden folgendes hin zu bekommen. Bitte helfe mir doch mal einer ...
So gut es geht mit Java ... [...] Deinen Code kann ich nicht genau nachvollziehen, aber in meinen kleinen Test habe ich ähnliche Probleme. comand = "ls -lA" funktioniert. comand = "find / -name '*etc*' -print" funktioniert nicht wirklich, ich höre wie meine HDD losrattert! Nur komme ich nicht an die Ausgabe ... Auf der Konsole funzt der find Befehl...
Also der 1. Befehl funktioniert (mkfifo). Aber beim zweiten funktioniert es nicht. Wie Ihr oben seht, geben ich den Befehl der dort ausgeführt werden soll auf der Kommandozeile aus. Wenn ich genau dieses in die Shell einfüge, dann wird er richtig ausgeführt. Jedoch im Programm leider nicht :-(.
Warum??
Das willst Du bestimmt nicht wissen *SCNR* Java ist Sucks!!! Na gut, es gibt noch Hoffnung: Schau mal diesen Link an: google -> de.comp.lang.java -> Runtime.getRuntime().exec() http://groups.google.de/groups?hl=de&lr=&ie=UTF-8&threadm=ba63dde5.0304081024.3f200211%40posting.google.com&rnum=2&prev=/groups%3Fq%3D%2BRuntime.getRuntime().exec%2Bgroup:de.comp.lang.java%26hl%3Dde%26lr%3D%26ie%3DUTF-8%26group%3Dde.comp.lang.java%26selm%3Dba63dde5.0304081024.3f200211%2540posting.google.com%26rnum%3D2 Der gute Mann meint, das eventuell noch zusätzlich "/bin/sh -c" ausgerufen werden muss ... Bring aber bei meinen "find" auch nix!!! Ausser, das jetzt das java Programm durchläuft ... Mit dem "String[]" funktioniert der ls Befehl auch nicht mehr *wunder*!
Sieht jemand von Euch den Fehler oder hat eine Idee? Denn ich habe keine Ahnung mehr woran es noch liegen könnte.
Ehrlich gesagt weiss ich keine Lösung, ausser vielleicht C/C++ lernen ... de.comp.lang.java weiss da bestimmt mehr!!! java version "1.4.1_01" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01) Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode) ------------ test.java ----------------------- import java.io.*; public class test { public static void main( String argv[] ){ // String comand = "ls -lA"; // String comand_find = "find / -name 'home' -print"; String[] comand_array = { "/bin/sh", " -c", "ls -lA" //"find /home -name 'voodoo' -print" }; try { Process proc_v1 = Runtime.getRuntime().exec(comand_array); proc_v1.waitFor(); BufferedReader in = new BufferedReader(new InputStreamReader(proc_v1.getInputStream())); String output; while( (output =in.readLine()) != null) { System.out.println("while loop " + output ); } } catch (Exception e) { System.out.println("Error: " + e.getMessage()); } } } ---------------------------------------------------------------------------- Ciao Andre
Moin ;-) Andre, hi List, Jubel! Genau daran lag es! :-) Jetzt habe ich es hinbekommen mit dem Ausführen. Es lag an den Shell-Befehlen. Nachdem ich so wie Du geschrieben hast /bin/sh -c davor gestellt habe hat es funktioniert. :-) Also die Ausgabe in Java umzuleiten ist kein Problem ... falls es Dich interessiert habe ich es hier aufgeschrieben: try { String comand = "ls -lh"; Process proc = Runtime.getRuntime().exec(comand); Reader inReader = new InputStreamReader(proc.getInputStream()); int ch; while((ch = inReader.read()) != -1) System.out.println(ch); } catch (Exception ex) { ex.printStackTrace(); } So müsste es funktionieren ... denn so funktioniert es auch bei mir ;-) ... wenn Du den Error-Stream haben willst, dann musst Du proc.getErrorStream() anstatt proc.getInputStream() ... Also Java programmiere ich nur, da unsere Profs an der Uni-Mannheim so toll finden und Klausuren drüber schreiben ... daher bin ich jetzt wieder am Java Programmieren ... aber da Du wohl gut C++ programmierst hätte ich da mal eine Frage ... wie kann ich denn in einem C++ Programm wenn ich ein fork und exec ausgeführt habe die Ausgaben lesen ... also praktisch das was oben in Java steht ... könntest Du (oder jemand anderes der C++ kann) mir da ein kleines Beispiel geben? Wäre klasse, da ich da schon einige male davor stand ... Merci und tia OLI Am Mi, 2003-11-19 um 19.51 schrieb Andre Heine:
Moin moin,
Am Wednesday 19 November 2003 18:06 schrieb Tim Oliver Wagner:
ich versuche jetzt schon seit 24 Stunden folgendes hin zu bekommen. Bitte helfe mir doch mal einer ...
So gut es geht mit Java ...
[...]
Deinen Code kann ich nicht genau nachvollziehen, aber in meinen kleinen Test habe ich ähnliche Probleme.
comand = "ls -lA" funktioniert.
comand = "find / -name '*etc*' -print" funktioniert nicht wirklich, ich höre wie meine HDD losrattert! Nur komme ich nicht an die Ausgabe ...
Auf der Konsole funzt der find Befehl...
Also der 1. Befehl funktioniert (mkfifo). Aber beim zweiten funktioniert es nicht. Wie Ihr oben seht, geben ich den Befehl der dort ausgeführt werden soll auf der Kommandozeile aus. Wenn ich genau dieses in die Shell einfüge, dann wird er richtig ausgeführt. Jedoch im Programm leider nicht :-(.
Warum??
Das willst Du bestimmt nicht wissen *SCNR*
Java ist Sucks!!!
Na gut, es gibt noch Hoffnung:
Schau mal diesen Link an: google -> de.comp.lang.java -> Runtime.getRuntime().exec() http://groups.google.de/groups?hl=de&lr=&ie=UTF-8&threadm=ba63dde5.0304081024.3f200211%40posting.google.com&rnum=2&prev=/groups%3Fq%3D%2BRuntime.getRuntime().exec%2Bgroup:de.comp.lang.java%26hl%3Dde%26lr%3D%26ie%3DUTF-8%26group%3Dde.comp.lang.java%26selm%3Dba63dde5.0304081024.3f200211%2540posting.google.com%26rnum%3D2
Der gute Mann meint, das eventuell noch zusätzlich "/bin/sh -c" ausgerufen werden muss ...
Bring aber bei meinen "find" auch nix!!! Ausser, das jetzt das java Programm durchläuft ...
Mit dem "String[]" funktioniert der ls Befehl auch nicht mehr *wunder*!
Sieht jemand von Euch den Fehler oder hat eine Idee? Denn ich habe keine Ahnung mehr woran es noch liegen könnte.
Ehrlich gesagt weiss ich keine Lösung, ausser vielleicht C/C++ lernen ...
de.comp.lang.java weiss da bestimmt mehr!!!
java version "1.4.1_01" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01) Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode)
------------ test.java ----------------------- import java.io.*;
public class test {
public static void main( String argv[] ){ // String comand = "ls -lA"; // String comand_find = "find / -name 'home' -print";
String[] comand_array = { "/bin/sh", " -c", "ls -lA" //"find /home -name 'voodoo' -print" };
try { Process proc_v1 = Runtime.getRuntime().exec(comand_array); proc_v1.waitFor(); BufferedReader in = new BufferedReader(new InputStreamReader(proc_v1.getInputStream())); String output; while( (output =in.readLine()) != null) { System.out.println("while loop " + output ); } } catch (Exception e) { System.out.println("Error: " + e.getMessage()); } } }
----------------------------------------------------------------------------
Ciao
Andre
Tim Oliver Wagner wrote: [...]
Also Java programmiere ich nur, da unsere Profs an der Uni-Mannheim so toll finden und Klausuren drüber schreiben ... daher bin ich jetzt wieder am Java Programmieren ... aber da Du wohl gut C++ programmierst hätte ich da mal eine Frage ... wie kann ich denn in einem C++ Programm wenn ich ein fork und exec ausgeführt habe die Ausgaben lesen ... also praktisch das was oben in Java steht ... könntest Du (oder jemand anderes der C++ kann) mir da ein kleines Beispiel geben? Wäre klasse, da ich da schon einige male davor stand ...
Ist zwar C ;-) , aber: man popen CU Dierk -- // Dierk Froehling // aycan Digitalsysteme GmbH // Innere Aumuehlstr. 5 // 97076 Wuerzburg // Germany // phone: +49 (0)931 2 70 40 9-0 // fax: +49 (0)931 2 70 40 9-1 // http://www.aycan.de
Moin moin, Am Wednesday 19 November 2003 22:17 schrieb Tim Oliver Wagner:
Jubel! Genau daran lag es! :-)
Super, google hilft immer wieder *g* [...]
Also Java programmiere ich nur, da unsere Profs an der Uni-Mannheim so toll finden und Klausuren drüber schreiben ...
Na gut, Java ist doch nicht so scheisse :) Java macht schon spass, ich nutze es allerdings nur für Konsolen Kram, also _ohne_ Swing. Swing ist mir einfach zu langsam auf einer Desktop Maschine. Für Server Programmierung ist Java übrigens der Hammer. Weil es so einfach und schnell mit der Entwicklung geht ...
daher bin ich jetzt wieder am Java Programmieren ... aber da Du wohl gut C++ programmierst hätte ich da mal eine Frage ... wie kann ich denn in einem C++ Programm wenn ich ein fork und exec ausgeführt habe die Ausgaben lesen ... also praktisch das was oben in Java steht ... könntest Du (oder jemand anderes der C++ kann) mir da ein kleines Beispiel geben? Wäre klasse, da ich da schon einige male davor stand ...
In C/C++ gibt es mehrere Möglichkeiten:
1. system() aus
Am Donnerstag, 20. November 2003 10:45 schrieb Andre Heine: [...]
In C/C++ gibt es mehrere Möglichkeiten:
1. system() aus
, siehe auch "man system" In der manpage steht auch Dein Beispiel für fork() !!
Mit system() kriegst Du aber die Ausgaben nicht in Dein Programm - es sei denn, Du lenkst die Ausgabe in eine Datei um und holst Dir diese dann per fopen() und fread() / fgets(), ... Dann lieber der schon erwähnte popen().
2. exec[l, lp, le, v, vp, ve] Familie aus
, siehe auch "man exec"
Wenn Du mit fork() - exec() arbeitest, solltest Du die u. g. Funktionen mit in Betracht ziehen.
Die Funktionen sind aus C, IIRC benutzt man diese auch für C++. Für C++ kenne ich noch "std::system" aus <cstdlib>, damit habe ich allerdings noch nicht gearbeitet.
Habe ich noch etwas vergessen?
Ja: pipe() dup() dup2() wait() waitpid() Jan
Am Friday 21 November 2003 01:04 schrieb Jan Trippler:
Am Donnerstag, 20. November 2003 10:45 schrieb Andre Heine:
In C/C++ gibt es mehrere Möglichkeiten:
1. system() aus
, siehe auch "man system" In der manpage steht auch Dein Beispiel für fork() !! Mit system() kriegst Du aber die Ausgaben nicht in Dein Programm - es sei denn, Du lenkst die Ausgabe in eine Datei um und holst Dir diese dann per fopen() und fread() / fgets(), ... Dann lieber der schon erwähnte popen().
Na ja, bislang habe ich nur system & die exec Familie genommen. popen kannte ich noch nicht, die Funktion scheint aber sehr sehr brauchbar zu sein!
2. exec[l, lp, le, v, vp, ve] Familie aus
, siehe auch "man exec" Wenn Du mit fork() - exec() arbeitest, solltest Du die u. g. Funktionen mit in Betracht ziehen.
Die Funktionen sind aus C, IIRC benutzt man diese auch für C++. Für C++ kenne ich noch "std::system" aus <cstdlib>, damit habe ich allerdings noch nicht gearbeitet.
Habe ich noch etwas vergessen?
Oha. sogar 'ne Menge ;()
Ja: pipe() dup() dup2() wait() waitpid()
Ciao Andre
[...] Sieht jemand von Euch den Fehler oder hat eine Idee? Denn ich habe keine Ahnung mehr woran es noch liegen könnte.
Nur so ein Schuß ins Blaue: tcextract -i /das/workingdir/vid1.fifo -t vob -x mpeg2 -a 0xe0 > /das/workingdir/blah_1.m2v möchte gerne von einer Shell interpretiert werden. -- Gruß, Alex
participants (5)
-
Alexander Veit
-
Andre Heine
-
Dierk Fröhling
-
Jan.Trippler@t-online.de
-
Tim Oliver Wagner