dvbscan mit Runtime.getInstance().exec() ausführen ?

Status
Nicht offen für weitere Antworten.

skywest

Mitglied
Hallo Leute,
ich möchte unter Suse 9.2 mittels Java einen Scan der für DVB verfügbaren TV-Programme ausführen.
Während in der Konsole die Anweisung

dvbscan Astra-19.2E

einwandfrei funktioniert und eine große Menge an Informationen ausgegeben werden, liefert mir das nachfolgende Coding
Code:
    public static void main(String[] args) {
    	Process p;
        try {
        	String[] cmd = new String[2];
            cmd[0] = "dvbscan";
            cmd[1] = "Astra-19.2E";
            p = Runtime.getRuntime().exec(cmd);
            BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()) );
            for ( String s; (s = in.readLine()) != null; )
            	System.out.println( s );
        } catch (IOException e) {
        	e.printStackTrace();
        }
     }
keinerlei Ausgabe. Hat jemand 'ne Idee, was ich falsch mache???
Danke im Voraus
skywest
 

Math55

Bekanntes Mitglied
hi, welches os? du musst, egal was du starten willst, bei windows oder linux noch was in cmd schreiben!!

gruß
 

thE_29

Top Contributor
Ne, wenn es ein alleinausführbares ding ist, brauchst du nicht cmd /coder konsole /e schreiben. Um das gings ja, wenn es mit ALT+F2 (ausführen in Lin) geht, dann sollte es mit Runtime auch gehen!
 

thE_29

Top Contributor
aja, genau :)
auf das hätte man draufkommen können, weil den Befehl Astra-19.2E gibts sicherlich net :)
 

skywest

Mitglied
Hallo Leute,
komme erst jetzt dazu zu antworten:
1. ALT+F2 und dvbscan eingeben nutzt nix, da dvbscan ohne Parameter nicht läuft
2. Habe obiges Coding wie folgt abgeändert:
Code:
    public static void main(String[] args) {
    	Process p;
        try {
       	        String[] cmd1 = new String[3];
        	cmd1[0] = "xterm";
        	cmd1[1] = "-e";
                cmd1[2] = "dvbscan " +
                                 "/home/geopod/workspace/JDVBMan/DVBData/DVB-S/Astra-19.2E > " +                              
                                 "/home/geopod/myDVBScan9";
            p = Runtime.getRuntime().exec(cmd1);
            System.out.println("INPUTSTREAM:");    
        } catch (IOException e) {
        	e.printStackTrace();
        }
        System.out.println("Ende");
        }
}
Dadurch öffnet sich eine Konsole und ich kann verfolgen, wie dvbscan arbeitet. Das Resultat kann ich in der Datei myDVBScan9 wunderbar überprüfen. Das hat aber zur Folge, dass sich ein Konsole Fenster öffnet. Das will ich nicht.
3. Die Variante ohne cmd[]
Code:
    public static void main(String[] args) {
    	Process p;
        try {
            String s = "dvbscan /home/geopod/workspace/JDVBMan/DVBData/DVB-S7Astra-19.2E";
            p = Runtime.getRuntime().exec(s);
            BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()) );
            System.out.println("INPUTSTREAM:");    
            for ( String s; (s = in.readLine()) != null; )
            	System.out.println( s );
        } catch (IOException e) {
        	e.printStackTrace();
        }
        System.out.println("Ende");
        }
}
führt dazu, dass relativ schnell die Ausgabe "INPUTSTREAM:" erfolgt. Die Ausgabe "Ende" wird aber auch nach mehreren Stunden nicht ausgegeben.
 

Bleiglanz

Gesperrter Benutzer
>>Die Ausgabe "Ende" wird aber auch nach mehreren Stunden nicht ausgegeben.

funktioniert aber wenigstens der Befehl?

leider ist exec recht komplex in der Anwendung (Java läuft ja weiter und weiss eigentlich nicht wann ein Befehl beendet ist...alles sehr kompliziert)

aber irgendwo (in der Klasse Process?) gibts ein waitfor oder sowas?
 

thE_29

Top Contributor
Jop

Code:
Runtime.getRuntime().exec("dvbscane parm1 parm2 param3").waitFor();

Mit ALt+F2 gib mal dvbscan mit deinen Params ein!
 

skywest

Mitglied
Hallo,
Der Befehl dvbscan param1 in der Konsole funktioniert einwandfrei.
Die Idee mit waitFor() habe ich auch ausprobiert. Hier das Coding
Code:
   	Process p;
        try {
               System.out.println("Vor Instanziierung von Process..."); 
               p = Runtime.getRuntime().exec("dvbscan /home/geopod/workspace/JDVBMan/DVBData/DVB-S/Astra-19.2E");
               System.out.println("Vor Instanziierung von BufferedReader");                    
               BufferedReader stdError = new BufferedReader(new 
                    InputStreamReader(p.getErrorStream()));
              System.out.println("Warten bis Process beendet ist...");                    
              p.waitFor();
              System.out.println("Process ist zu Ende");                    
              for ( String s; (s = stdError.readLine()) != null; ){
            	System.out.println( s );
               }
            p.destroy();   
        } catch (IOException e) {
        	e.printStackTrace();
		}
        System.out.println("ENDE");
Das Ergebnis ist die Ausgabe von

Vor Instanziierung von Process...
Vor Instanziierung von BufferedReader
Warten bis Process beendet ist...

Das Programm wird nicht beendet. Es kommt nie zu der Ausgabe von

Process ist zu Ende
ENDE

Ich muss das Programm abschießen. Bin mittlerweile ziemlich am verzweifeln... :bahnhof: ???:L :autsch:
 

skywest

Mitglied
Hi,
sorry habe das falsche Coding gepostet. Lässt man mal den BufferedReader weg, so kann man alles auf das folgende Minimalcoding reduzieren
Code:
      Process p;
        try {
               System.out.println("Vor Instanziierung von Process...");
               p = Runtime.getRuntime().exec("dvbscan /home/geopod/workspace/JDVBMan/DVBData/DVB-S/Astra-19.2E");
              System.out.println("Warten bis Process beendet ist...");                   
              p.waitFor();
             System.out.println("Process ist beendet...");                   
        } catch (IOException e) {
           e.printStackTrace();
      }
        System.out.println("ENDE");

Frage: Warum wird der Prozess nie beendet (Die Ausgabe von "Process ist beendet" erscheint nie) , obwohl der gleiche Aufruf in der Konsole sehr wohl terminiert
???:L
 

Bleiglanz

Gesperrter Benutzer
ist dvbscan zufällig ein shellskript?

dann ist der hauptprozess ja die per shebang gestartete bash und...

The created subprocess does not have its own terminal or console. All its standard io (i.e. stdin, stdout, stderr) operations will be redirected to the parent process through three streams (Process.getOutputStream(), Process.getInputStream(), Process.getErrorStream()). The parent process uses these streams to feed input to and get output from the subprocess. Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.
 

thE_29

Top Contributor
mach mal

konsole /e "dvbscan /home/geopod/workspace/JDVBMan/DVBData/DVB-S/Astra-19.2E"

als Ausführung!
 

skywest

Mitglied
Hi,
nein, dvbscan ist eine ausführbare Datei. Offensichtlich kommt es aber genau zu dem beschriebenen Deadlock. Gibt es dafür Lösungen?
 

skywest

Mitglied
Meinst du in der Konsole
xterm -e dvbscan /home/geopod/workspace/JDVBMan/DVBData/DVB-S/Astra-19.2E eingeben ???
Wenn ja => Das funktioniert. Und nu ???
 

skywest

Mitglied
Hallo Leute,
ich glaube des Rätsels Lösung in
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4062587
gefunden zu haben.
Im Wesentlichen wird darauf hingewiesen, dass ein Subprozess sich aufhängt, wenn zuviele Ausgaben über stdout bzw. stderr erzeugt werden.
Dieser Bug wird zwar nicht gefixt werden, aber die Lösung soll angeblich darin liegen, dass der Hauptprozess die stdout und stderr einliest. Bin mal gespannt, ob das funktioniert. Werde es die Tage probieren und (sollte es funktionieren) hier die Lösung posten
 

skywest

Mitglied
Hallo Leute,
ich geb's auf. Das ist der letzte Beitrag zu diesem Thema von mir, damit ich euch nicht nerve. Habe noch folgendes Coding ausprobiert. Leider verhält sich auch dieses Coding so, dass der Hauptprozess nicht terminiert.
Code:
   	Process p;
        try {
             System.out.println("Variant 7 Process is initializing..."); 
               p = Runtime.getRuntime().exec("dvbscan /home/geopod/workspace/JDVBMan/DVBData/DVB-S/Astra-19.2E");
               System.out.println("Variant 7 ErrorStream is initializing...");                    
               BufferedReader stdError = new BufferedReader(new 
                    InputStreamReader(p.getErrorStream()));
               System.out.println("Variant 7 InputStream is initializing...");
               BufferedReader stdin = new BufferedReader(new 
                    InputStreamReader(p.getInputStream()));
              System.out.println("Variant 7 ErrorStream is writing..."); 
              for ( String s; (s = stdError.readLine()) != null; ){
            	System.out.println( s );
               }
              System.out.println("Variant 7 InputStream is writing...");
              for ( String s; (s = stdin.readLine()) != null; ){
            	System.out.println( s );
               }
            System.out.println("Variant 7 Process is being destroyed...");  
            p.destroy();   
            System.out.println("Variant 7 ended...");                    
        } catch (IOException e) {
        	e.printStackTrace();
		}
        System.out.println("Variant 7 has terminated");
    }
Fazit : Dieses Coding NICHT benutzen! :noe:
 

thE_29

Top Contributor
Das ist aber klar warum :)

der hängt sich nämlich in deinen for Schleifen auf, da er nie null zurückliefert, da der string wahrscheinlich nie null ist!

Frag mal nur auf den normalen Inputstream (also Ausgabe vom Programm) und nicht auf die Fehlerausgabe!

Notfalls debug mal durch und schau wo er stecken bleibt!
 
G

Guest

Gast
Hi,
das versteh' ich nicht. Nach meinem Verständnis muss der String irgendwann mal null werden. Ein Versuch mit InputStream habe ich auch vorgenommen. Bei diesem Versuch wird aber gar kein String ausgegeben.
Ich verstehe hier gar nix mehr.
Bis denne, skywest
 

Bleiglanz

Gesperrter Benutzer
s = stdError.readLine()

"blockt" (lies mal in der API), hast du da schon mal was davon gehört? Wenn dein Programm nie den richtigen EOF produziert, dann wartet dieser Aufruf EWIG
 

skywest

Mitglied
Hallo,
der letzte Tip war Gold wert. Mit nachfolgendem Coding ist das Problem gelöst.
Fazit für mich: Bei Nutzung von Runtime.getRuntime().exec() und der Auswertung der Ausgabe des Subprozesses kann man sich nie auf die Qualität der Ausgabe verlassen. Die Benutzung von BufferedReader.ReadLine() ist daher nicht sicher, während BufferedReader.Read() funktioniert.
Allen, denen ich auf die Nerven gegangen bin und allen die mich Schritt für Schritt der Lösung näher gebracht haben ein DANKE SCHÖN :D
Abschließend die Lösung
Code:
    	Process p;
        try {
               p = Runtime.getRuntime().exec("dvbscan -q /home/geopod/workspace/JDVBMan/DVBData/DVB-S/Astra-19.2E");
               BufferedReader stdin = new BufferedReader(new 
                    InputStreamReader(p.getInputStream()));
              boolean lvContinue = true;
              char lvChar;
              while (lvContinue){
              	int lvInt = stdin.read();
              	if (lvInt == -1){
              		lvContinue = false;
              	} else {
              		lvChar = (char)stdin.read();
              		System.out.print(lvChar);
              	}
               }
            p.destroy();   
        } catch (IOException e) {
        	e.printStackTrace();
		}
    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Registry Autostart Eintrag ertstellen mit Java (Runtime.getRuntime().exec()) Allgemeine Java-Themen 0
M this application requires a java runtime environment 1.8.0 Allgemeine Java-Themen 2
S Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..? Allgemeine Java-Themen 7
J Verschiedene Runtime Versionen gleichzeitig? Allgemeine Java-Themen 12
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
H Runtime reagiert erst wenn Programm abbricht Allgemeine Java-Themen 1
J Probleme mit der Java-Runtime Allgemeine Java-Themen 10
M Runtime.exec() verursacht auf manchen Systemen Probleme - Ursache unklar Allgemeine Java-Themen 2
S Command funktioniert in Kommandzeile aber nicht mit ProcessBuilder bzw. Runtime.exec auf MAC Allgemeine Java-Themen 3
D Java Objekt als Service in Runtime registrieren Allgemeine Java-Themen 1
Thallius Runtime.getRuntime().exec " escapen? Allgemeine Java-Themen 9
W Threads Mit Thread und Runtime externe Programme öffnen Allgemeine Java-Themen 0
C Runtime Problem Allgemeine Java-Themen 1
P programm öffnen mit der runtime Allgemeine Java-Themen 9
N Runtime.getRuntime().exec Problem mit find Allgemeine Java-Themen 3
W JavaDoc Runtime-Exceptions: Wie sinnvoll anzeigen? Allgemeine Java-Themen 14
P Runtime bzw. RAM-Auslastung eines Prozesses Allgemeine Java-Themen 9
M Befehl in Runtime ausführen der Eingabe benötigt Allgemeine Java-Themen 3
aze Jar ausführen über Runtime.execute funktioniert nicht Allgemeine Java-Themen 4
T Bluescreen bei Runtime.exec(); Allgemeine Java-Themen 8
I Runtime.getRuntime().exec Problem Allgemeine Java-Themen 4
G Runtime.exec beendet Programm unter Linux, wenn Java Programm beendet wird Allgemeine Java-Themen 3
N Runtime.exec() Exception Problem Allgemeine Java-Themen 3
N Runtime.exec() Allgemeine Java-Themen 7
S Runtime Exceptions in eine Datei schreiben Allgemeine Java-Themen 7
N Internet Explorer mit bestimter Java Runtime starten Allgemeine Java-Themen 2
truesoul Runtime.getRuntime().exec nebenbei ausführen Allgemeine Java-Themen 12
S Runtime.getRuntime()... Allgemeine Java-Themen 6
Z Runtime.getRuntime().exec-Problem Allgemeine Java-Themen 4
J Runtime.exec setzt Fokus auf Frame Allgemeine Java-Themen 2
V Probleme mit Runtime.exec() Allgemeine Java-Themen 3
M Runtime.exec() - Performance / Frage zu Threads Allgemeine Java-Themen 5
S Rückgabewert runtime Allgemeine Java-Themen 11
M Runtime.getRuntime().exec(cmd); auf windows ... Allgemeine Java-Themen 2
martin82 Java Runtime Update >17 - SwingWorker Änderungen? Allgemeine Java-Themen 7
T Runtime.exec() Allgemeine Java-Themen 3
X Wann ist Runtime.getRuntime().exec mit Copy fertig? Allgemeine Java-Themen 10
W java ohne runtime Allgemeine Java-Themen 2
G Output eines über Runtime.getRuntime.exec gestarteten Jars Allgemeine Java-Themen 6
N runtime.exec() Problem Allgemeine Java-Themen 6
W Runtime.getRuntime().exec() Allgemeine Java-Themen 10
lordcarlos Runtime exec und mplayer (linux) Allgemeine Java-Themen 11
C JApplet und Runtime.getRuntime().exec() Allgemeine Java-Themen 2
K Runtime.exec mit Timeout Allgemeine Java-Themen 5
0 Runtime.exec() VLC starten klappt nicht Allgemeine Java-Themen 9
G Runtime.exec - Prozess "mittendrin" "einfach Allgemeine Java-Themen 4
G Runtime? Allgemeine Java-Themen 3
J Runtime.exec unter win vista? Allgemeine Java-Themen 10
M Probleme Runtime.getRuntime().exec(Start.cmd); Allgemeine Java-Themen 10
F Problem mit Runtime.exec() Allgemeine Java-Themen 8
S Problem mit Runtime. Allgemeine Java-Themen 2
E Programm mit der Runtime ausführen Allgemeine Java-Themen 8
M Runtime & Exception Allgemeine Java-Themen 3
J ServiceInterface - Runtime() > jemand eine idee? Allgemeine Java-Themen 2
A Runtime oder ProcessBuilder exe starten Allgemeine Java-Themen 3
V Java-Programm vom USB-Stick ohne Runtime-Installation Allgemeine Java-Themen 18
W In Runtime Output schreiben Allgemeine Java-Themen 5
J Probiert mal bitte aus (Thread + Runtime) Allgemeine Java-Themen 10
A Installierte Runtime ermitteln Allgemeine Java-Themen 3
M Runtime.exec unter Vista (Administrator Rechte) Allgemeine Java-Themen 2
K Probleme mit Runtime.getRuntime().exec Allgemeine Java-Themen 6
T ausführbares jar File mit integriertem Java Runtime 6+JOGL Allgemeine Java-Themen 7
A Runtime.getRuntime().exec mit Warte auf Beendigung - Wie? Allgemeine Java-Themen 7
R Problem mit Runtime.getRuntime().exec() Allgemeine Java-Themen 4
the[V]oid Ausführen von "javac" über Runtime.exec() Allgemeine Java-Themen 4
W Runtime Error216 Runtime error 217 Allgemeine Java-Themen 6
B Runtime Verzeichniss wechseln Allgemeine Java-Themen 8
C Java SE Runtime 6 Update 1 - IE 7 und FF 2.0 - Allgemeine Java-Themen 6
F Runtime.getRuntime().exec mit Linux und Leerzeichen Allgemeine Java-Themen 3
D runtime.exec --> Prozess hängt sich auf Allgemeine Java-Themen 7
T Runtime.exec -> Prozesskontrolle abgeben ? Allgemeine Java-Themen 11
B Probleme mit Runtime.getRuntime().exec("cmd.exe") Allgemeine Java-Themen 4
M Runtime.getRuntime().exec(txt_rsync_option.getText()); Allgemeine Java-Themen 12
M Rückgabewert von Runtime.getRuntime().exec() Allgemeine Java-Themen 2
G Programm wird von java cmd runtime nicht aufgerufen? Allgemeine Java-Themen 13
S Runtime.exec() berechtigungen Allgemeine Java-Themen 5
S Runtime.exec und X Umgebung Allgemeine Java-Themen 2
A Runtime Process bricht nicht ab! Allgemeine Java-Themen 7
F Shell-Programme per Runtime.exec() starten und mehr? Allgemeine Java-Themen 4
K Runtime.exec und DFÜ-Verbindung Allgemeine Java-Themen 5
C Rechte unter WinXP, MySQL-Server per Runtime herunterfahren? Allgemeine Java-Themen 6
P Copy mit Runtime.exec() unter Unix Allgemeine Java-Themen 4
D Problem mit Runtime.getRuntime().exec() Allgemeine Java-Themen 14
L Runtime.getRuntime.exec() Allgemeine Java-Themen 7
T Probleme mit Runtime.exec in Jar File Allgemeine Java-Themen 2
M Runtime.exec unter Linux Allgemeine Java-Themen 11
G Java Runtime Verzeichnis ermitteln Allgemeine Java-Themen 3
X Problem mit Runtime.getRuntime().exec("cls"); Allgemeine Java-Themen 18
S Runtime.getRunTime().exec("jar cvf .) hängt sich auf Allgemeine Java-Themen 3
9 J2SE Runtime Environment 5.0 Allgemeine Java-Themen 6
M Runtime.getRuntime().exec() - Fehler abfangen Allgemeine Java-Themen 5
S Runtime exec unter MacOS X will nicht "open pfad" Allgemeine Java-Themen 7
B Problem mit Runtime.getRuntime().exec() Allgemeine Java-Themen 4
G Runtime.getRuntime() Allgemeine Java-Themen 10
G Runtime.getRuntime().exec("cmd /c START") Allgemeine Java-Themen 3
M Runtime.exec() => java.io.exception: too many open files Allgemeine Java-Themen 10
S Programm starten mit Runtime aktuelles Verzeichnis wechseln Allgemeine Java-Themen 7
N Guice - Ohne injector.getInstance Allgemeine Java-Themen 2
B Cipher.getInstance Aufruf sehr langsam Allgemeine Java-Themen 2
S GregorianCalendar.getInstance() Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben