Process - Befehle senden

Status
Nicht offen für weitere Antworten.
Hallo Leute,

habe leider ein Problem, dass ich noch nicht lösen konnte und an dem ich fast am verzweifeln bin ???:L .
Ich versuche an einen Process mehrere Befehle zu senden. Das klappt bei mir aber nicht so ganz wie es soll.

Eine Instanz Process p wird in der Klasse ConsoleProcess gestartet (Singleton-Muster). In der selben Klasse kann ich über eine Methode execProc individuelle Befehle - die nacheinander in dem Process ausgeführt werden sollen - senden.
Das ist die Idee, die dahinter steht. Allerdings funktioniert das nur für den ersten Befehl den ich sende. Führe ich einen weiteren Befehl aus, wird eine Exception geschmissen.

Allerdings weiß ich nicht warum???? (Meine Idee ist, dass der Process beendet wird bevor überhaupt der nachfolgende Befehl ausgeführt wird.)
Hoffentlich könnt ihr mir weiterhelfen - weiß leider nicht mehr weiter.

Anbei der komplette lauffähige Code. Bin wirklich dankbar für jede Hilfe.

Der Code:
EDIT: Out- und Inputstreams werden nun nicht mehr geschlossen. + Thread-sichere Methode für execProc()

Klasse ProcessesMain
Code:
import java.io.IOException;

public class ProcessesMain {
	public static void main(String[] args) throws IOException {
		// Get instance of process.
		ConsoleProcess cp = ConsoleProcess.getInstance();
		cp.execProc("include x.grs");
		cp.execProc("show graph ycomp");
		cp.execProc("debug enable");
		cp.execProc("debug disable");
	}
}

Klasse ConsoleProcess
Code:
import java.io.IOException;

/** This class handles one started process. */
public class ConsoleProcess {
	/** A process to run the GrShell in a command prompt (DOS console). */
	private Process p;
	/** The single instance of ConsoleProcess. */
	private static ConsoleProcess cp;

	private ConsoleProcess() { // A private constructor - a singleton pattern
		initProc();
	}

        /* Returns instance of process console. */
	public static ConsoleProcess getInstance() {
		if (cp == null) {
			cp = new ConsoleProcess();
		}
		return cp;
	}

        /* Create the process builder to start the process. */
	private void initProc() {
		if (p == null) {
			// Start a command process. Currently only Windows based
			// operating systems are supported.
			ProcessBuilder pb = new ProcessBuilder("grshell");
			try {
				p = pb.start();
			} catch (IOException e) {
				System.err
						.println("ERR: ProcessBuilder did not start the process.");
				System.err.println(e.getMessage());
			}
		}
	}

        /* Sends and executes a command. Will be executed within threads (StreamChoker + StreamGobbler). Thread-safe*/
	public synchronized void execProc(String cmd) {
		// Append an 'ENTER'-key to execute command ( \r\n = ENTER )
		String str = cmd + " \r\n";
		StreamChoker c = new StreamChoker(str, p.getOutputStream());
		c.start();
		// Print results on screen.
		StreamGobbler s1 = new StreamGobbler(p.getInputStream());
		StreamGobbler s2 = new StreamGobbler(p.getErrorStream());
		s1.start();
		s2.start();
	}
}

Klasse StreamChoker
Code:
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class StreamChoker implements Runnable {
	/** The output stream of a process to write to the command prompt. */
	private final OutputStream os;
	private final String cmd;
	private Thread thread;
	
	public void start() {
		thread = new Thread(this);
		thread.start();
	}
	
	public StreamChoker(String cmd, OutputStream os) {
		this.os = os;
		this.cmd = cmd;
	}

	/**
	 * Runs the thread. Emit and execute the command to the output stream into the console.
	 */
	@Override
	public void run() {
		BufferedOutputStream bos = new BufferedOutputStream(os);
		
		try {
			bos.write(cmd.getBytes());
			bos.flush();
		} catch (IOException e) {
			System.err.println("ERR: Invalid entering sequence." + " '" + cmd + "'  not be executed." );
			System.err.println(e.getMessage());
		}
	}

}

Klasse StreamGobbler
Code:
import java.io.BufferedReader;
import java.io.IOException;

import java.io.InputStream;
import java.io.InputStreamReader;

public class StreamGobbler implements Runnable {
	/** The input stream of a process to read the command prompt. */
	private final InputStream is;
	private Thread thread;
	
	public void start() {
		thread = new Thread(this);
		thread.start();
	}
	
	public StreamGobbler(InputStream is) {
		this.is = is;
	}

	/**
	 * Runs the thread. Prints the process's input stream on the console.
	 */
	@Override
	public void run() {
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		
		String str;
		try {
			while ((str = br.readLine()) != null) {
				System.out.println(str);
			}
		} catch (IOException e) {
			System.err.println("ERR: Invalid reading sequence.");
			System.err.println(e.getMessage());
		}
	}

}
 
S

SlaterB

Gast
in Zeile 37 von StreamChoker wird der übergebene p.getOutputStream() geschlossen,
danach kannst du logischerweise nichts mehr reinschreiben
 
Wo du recht hast, hast du recht. Danke für die schnelle Info.
Ich war in der Annahme, dass ich nach jedem gesendeten Befehl den Outputstream neu erzeugen könnte. Ist aber nicht der Fall, steht auch in der API - hätt ich die bloß gelesen.

Danke :applaus:
 
Noch ne kleine Frage?
Beim Senden von mehreren Befehlen (execProc()), geraten wohl die Threads durcheinander, siehe ProcessesMain.
Wie kann ich die Methodenaufrufe in der vorgegebenen Reihenfolge auszuführen???

Ich habe bereits die Methode execProc() in der Klasse ConsoleProcess synchronisiert.
 
S

SlaterB

Gast
tja, kannst du ein Anfang und Ende bei solchen Aufgaben feststellen, vor allem das Ende?

die einzelnen Aufgaben müssen vielleicht kein Thread sein sondern Aufgaben-Objekte,
die von einem bestimmten Arbeitsthread in Reihenfolge bearbeitet werden,

für die Ausgabe reichen dann vielleicht nur zwei Threads,
die StreamGobbler haben ja eh nix direkt mit dem einzelnen Befehl zu tun
 
G

Gast2

Gast
Moin,

spaghettiBolognese hat gesagt.:
Noch ne kleine Frage?
Beim Senden von mehreren Befehlen (execProc()), geraten wohl die Threads durcheinander, siehe ProcessesMain.
Wie kann ich die Methodenaufrufe in der vorgegebenen Reihenfolge auszuführen???

mit einer Queue ... ungefährt so

1 ... schaue ob in der Queue was drinnen ist
2 ... hole Dir die Aufgabe vom anfang
3 ... führe sie aus
4 ... zurück zu 1

hand, mogel
 
G

Guest

Gast
@SlaterB

Nein, der Anfang und das Ende steht nicht fest.

Habe die execProc()'s nur versuchsweise aufgestellt. Der eigentliche Sinn des ganzen Programms ist folgender:

In der IDE Eclipse habe ich eine eigene Perspektive mit verschiedenen Buttons entwickelt. Über diese Buttons sollen verschiedene Befehle an den Prozess gesendet werden.
Da der User hier interagiert wie er Lust und Laune hat ist mir kein Anfang und kein Ende bekannt. Anfang ist dann, wenn einer der Buttons geklickt wird. Das Ende ist wohl ein openEnd bis Eclipse geschlossen wird :?:

Aber die Frage die sich mir dabei stellte: Was passiert wenn der User ziemlich oft und ziemlich schnell innerhalb kurzer Zeit verschiedene Befehle sendet. Kommen dann die Threads durcheinander???? Das ist ja unerwünscht.

Beispiel:
10x "show graph"
3x "delete graph"
6x "debug enable"
1x "show graph"
 
@SlaterB

Nein, der Anfang und das Ende steht nicht fest.

Habe die execProc()'s nur versuchsweise aufgestellt. Der eigentliche Sinn des ganzen Programms ist folgender:

In der IDE Eclipse habe ich eine eigene Perspektive mit verschiedenen Buttons entwickelt. Über diese Buttons sollen verschiedene Befehle an den Prozess gesendet werden.
Da der User hier interagiert wie er Lust und Laune hat ist mir kein Anfang und kein Ende bekannt. Anfang ist dann, wenn einer der Buttons geklickt wird. Das Ende ist wohl ein openEnd bis Eclipse geschlossen wird :?:

Aber die Frage die sich mir dabei stellte: Was passiert wenn der User ziemlich oft und ziemlich schnell innerhalb kurzer Zeit verschiedene Befehle sendet. Kommen dann die Threads durcheinander???? Das ist ja unerwünscht.

Beispiel:
10x "show graph" - Button
3x "delete graph" - Button
6x "debug enable" - Button
1x "show graph" - Button
 
S

SlaterB

Gast
also ich kann nur mit Fakten arbeiten,
wie du beliebige unkontrolliert lange laufende Prozesse sortierst weiß ich nicht
 
G

Guest

Gast
:D Ich auch (noch) nicht. Aber wenns soweit ist, kann ich dich ja beraten :wink:

Danke auf jeden Fall für die Antworten.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Compiler-Fehler child process exited with code 1 Allgemeine Java-Themen 1
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
P Herausfinden, ob ein Process ein Fenster hat Allgemeine Java-Themen 1
D Java Process OutputStream ist null Allgemeine Java-Themen 4
X Problem bei process.start() ExitValue Allgemeine Java-Themen 5
T Mit Java auf die Konsole eines Process-Objekts zugreifen Allgemeine Java-Themen 10
P Input/Output Process.getErrorStream = OutputStream Allgemeine Java-Themen 11
J Download: Filename + Process waitFor() Allgemeine Java-Themen 5
S Wie beendet man einen Process in Java Platform unabhänging? Allgemeine Java-Themen 8
M Process wird gestoppt und nach beenden der Anwendung fortgeführt Allgemeine Java-Themen 4
G Process.destory() == CTRL+C Allgemeine Java-Themen 2
P Swing GUI Process anzeigen Allgemeine Java-Themen 10
F Process.getInputStream unter Linux Allgemeine Java-Themen 7
schlingel Process - Ausgabe leer Allgemeine Java-Themen 5
G ungepufferter Process.getInputStream Allgemeine Java-Themen 10
J Process beenden ...aber wie ? Allgemeine Java-Themen 19
G Process - mehrere Commands?! Allgemeine Java-Themen 2
MQue auf gestarteten Process warten Allgemeine Java-Themen 7
G Process.wait() auf Folgeprozesse mitwarten Allgemeine Java-Themen 29
P Bedeutung der Process.exitValue() Werte? Allgemeine Java-Themen 3
J Process auf Console anzeigen lassen. Allgemeine Java-Themen 5
B Process Builder Allgemeine Java-Themen 10
D Thread & Process: Beenden einer Batch-Datei Allgemeine Java-Themen 8
J process.getInputStream() hängt auf merkwürdige Art und Weise Allgemeine Java-Themen 7
D Fremdes Programm schließen (ohne process.destroy()) Allgemeine Java-Themen 8
S process.waitFor() endet mit -1 Allgemeine Java-Themen 3
M Process -> getInputStream -> nur gepuffert ? Allgemeine Java-Themen 12
A Runtime Process bricht nicht ab! Allgemeine Java-Themen 7
C Process output Allgemeine Java-Themen 7
rtm007 Per Java Im Terminal Befehle eingeben. Allgemeine Java-Themen 4
A Befehle in Konsole. Allgemeine Java-Themen 12
T if - Befehle Allgemeine Java-Themen 6
T Git-Befehle mit Java ausführen Allgemeine Java-Themen 5
U CMD Befehle als Admin ausführen Allgemeine Java-Themen 6
O Threads und If Befehle Allgemeine Java-Themen 7
X Java Plugin Befehle Allgemeine Java-Themen 2
C Roboter, Befehle parsen Allgemeine Java-Themen 12
D befehle an laufendes programm Allgemeine Java-Themen 8
E Gibt es Befehle für Kursor auf Konsole ? Allgemeine Java-Themen 3
T Shell befehle ausführen - wie? Allgemeine Java-Themen 2
Ark Wann 64 Bit-Befehle im Einsatz? Allgemeine Java-Themen 6
B Access-Befehle werden in der falschen Reiehnfolge ausgeführt Allgemeine Java-Themen 4
T Befehle verschachteln. Allgemeine Java-Themen 5
N mehrere befehle im cmd Allgemeine Java-Themen 3
N CMD, EXEC, Befehle senden Allgemeine Java-Themen 3
G Java-Befehle Native und Static Allgemeine Java-Themen 2
V Befehle von der Konsole einlesen und Escape-Sequenzen. Allgemeine Java-Themen 2
D Wie kann ich einem externen Programm einen Befehle schicken? Allgemeine Java-Themen 3
M Linux-Befehle per Programm ausführen Allgemeine Java-Themen 10
Z E-Mail senden Allgemeine Java-Themen 2
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
TimEtech Email senden - web.de ; Fehlercode Allgemeine Java-Themen 2
Master3000 Dateien zwischen verschiedenen Netzwerken senden Allgemeine Java-Themen 17
G Datei senden via Xmodem an Serial-Port Allgemeine Java-Themen 35
P XML Dokumente von JDOM an ein WebService senden! Allgemeine Java-Themen 2
Joker4632 Methoden Befehl an bereits extern geöffnete Programm-spezifische Konsole senden Allgemeine Java-Themen 1
Q Selbständig ActionEvent auslösen zum Daten senden über serielle Schnittstelle Allgemeine Java-Themen 7
R Android Daten online senden Allgemeine Java-Themen 0
KeVoZ_ Java Mail senden - geht nicht Allgemeine Java-Themen 4
K Input/Output E-mail Zusammenfassen Senden Allgemeine Java-Themen 2
OnDemand JavaMail ohne Anhang senden Allgemeine Java-Themen 4
T Strings über Bluetooth zwischen PC,µc oder Samrtphone senden und empfangen Allgemeine Java-Themen 0
W Thread sleep 30 sekunden - wenn keine Antwort bis dahin neu senden Allgemeine Java-Themen 2
G String an Arduino senden NullPointerException in PrintWriter Allgemeine Java-Themen 6
O SMS senden in Java mit SIM-Karte Allgemeine Java-Themen 5
C Input/Output Zip Files über Socket senden und empfangen Allgemeine Java-Themen 6
O Serial Port Daten als Tastaturanschlag senden Allgemeine Java-Themen 0
A Tastendruck an Firefox senden Allgemeine Java-Themen 7
F E-Mail aus JAVA senden nach Umstellung auf Netbean 7.4 mit Java 7U45 nicht mehr möglich Allgemeine Java-Themen 4
H ESC/POS Steuerzeichen an Drucker senden Allgemeine Java-Themen 4
GUI-Programmer JavaMail - Anhang hochladen vor senden der Nachricht Allgemeine Java-Themen 4
C Datei kodiert zu Webservice senden Allgemeine Java-Themen 9
R Dateien vom Windows-Explorer zum Programm senden Allgemeine Java-Themen 21
J String an Port senden Allgemeine Java-Themen 2
M Antwort auf Outlook-Besprechungsanfrage per Java senden Allgemeine Java-Themen 5
S OutputStream via POST senden Allgemeine Java-Themen 4
M [Java Mail] Multipart beim Senden funktioniert nicht. Allgemeine Java-Themen 11
D Fax senden mit Faxgerät über LAN Allgemeine Java-Themen 3
W mail senden mit java Allgemeine Java-Themen 4
Developer_X Email per Java senden Allgemeine Java-Themen 81
M String an externen Prozess senden/auslesen Allgemeine Java-Themen 25
G Javamail Nachricht senden: Betreff und Header fehlen Allgemeine Java-Themen 4
G Anfrage senden. Allgemeine Java-Themen 3
B Html Formulare mittels Java automatisch senden Allgemeine Java-Themen 5
R Nachrichten an laufendes Programm senden Allgemeine Java-Themen 4
G Tastaturbefehl mit Java ins System senden. Allgemeine Java-Themen 3
R Header per Java senden Allgemeine Java-Themen 6
G html-code an drucker senden Allgemeine Java-Themen 10
B Thread soll auf Event warten, dann Daten an Klasse senden Allgemeine Java-Themen 2
G TCP/IP String senden Allgemeine Java-Themen 11
S String an COM-Schnittstelle senden Allgemeine Java-Themen 6
S mails senden? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben