Wie zu Lesen JSch Befehl output?
Ich habe den folgenden code:
JSch jsch = new JSch();
jsch.setKnownHosts(dotSshDir + "/known_hosts");
jsch.addIdentity(dotSshDir + "/id_rsa");
Session session = jsch.getSession(userName, hostname, 22);
session.connect();
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand(command);
channel.setInputStream(null);
channel.setErrStream(System.err);
Reader reader = new InputStreamReader(channel.getInputStream());
char[] buf = new char[1024];
int numRead;
while ((numRead = reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
result.append(readData);
buf = new char[1024];
}
Hängt es versuchen zu Lesen aus dem reader. Wie kann ich dieses Problem beheben? Wie gehe ich über die Jagd nach, was ist passiert?
Das Aufhängen war eigentlich wegen etwas unausgeglichene Anführungszeichen in der Befehlszeile ein.
Könnten Sie Ihre Lösung als Antwort statt eines Kommentars?
Könnten Sie Ihre Lösung als Antwort statt eines Kommentars?
InformationsquelleAutor November Yankee | 2011-08-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den hängen war eigentlich wegen etwas unausgeglichene Anführungszeichen in der Befehlszeile ein.
Für die Nachwelt, der endgültige code (nach dem Umgang mit einigen anderen Fragen) ist:
Yap: könnten Sie bitte etwas aufwendig die Methode waitForChannelClosed(Kanal);
Siehe die Antwort hier stackoverflow.com/questions/16298279/...
Ich von Ihnen positiv bewertet werden, dass diese Antwort gestern, aber heute finde ich, dass meine impl der waitForChannelClosed hängt manchmal auf unbestimmte Zeit, also caveat emptor
In der Tat, diese Antwort kann einen deadlock verursachen, als meine Antwort erklärt.
InformationsquelleAutor November Yankee
Die akzeptierte Antwort von @NoelYap ist falsch.
Hat man zum Lesen der Ausgabe-kontinuierlich, während der Wartezeit für den Befehl zu beenden. Ansonsten, wenn der Befehl erzeugt genug Leistung, um zu füllen in einem output-buffer, wird der Befehl hängen, warten auf den Puffer verbraucht werden, was nie passiert. So erhalten Sie einen deadlock.
Das folgende Beispiel liest sowohl stdout und stderr kontinuierlich, während die überwachung einen Befehl status. Es basiert auf der offizielle JSch
exec.java
Beispiel (fügt nur eine Lesung von stderr).Wenn Sie hinzufügen
while (!channel.isClosed()) {}
nach derchannel.connect();
Sie werden sehen, dass mit einer ausreichend großeni
in der shellfor
loop (10000 reicht in meinem Umfeld), wird die Schleife nie beendet.InformationsquelleAutor Martin Prikryl