更具体地说,我真正想做的是打开两个新的终端。从terminal_1我想ssh @ host1并运行program1到host1。从terminal_2我想ssh @ host2并运行program2到host2。我需要在terminal_1上查看program1的输出,并在terminal_2上查看program2的输出。
(我已经设法打开xterm和ssh @ host.I试图传递第二个命令“&& java echo_1”但它什么都不做)
以下是代码:
import java.io.*;
public class multi1 implements Runnable {
public void run() {
try {
String ss = null;
Runtime obj = null;
String[] newcmd = new String[]{"/usr/bin/xterm","-hold","-e","ssh andreas@192.168.0.0&&java echo_1"};
Process p = Runtime.getRuntime().exec(newcmd);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((ss = stdInput.readLine()) != null) {
System.out.println(ss);
}
}catch (IOException e) {
System.out.println("FROM CATCH" + e.toString());
}
}
public static void main(String[] args) throws Exception {
Thread th = new Thread(new multi1());
th.start();
//Thread th2 = new Thread(new multi1());
//th2.start();
}
}
答案 0 :(得分:0)
我宁愿使用jsch或其他ssh库而不使用终端和执行。
答案 1 :(得分:0)
我立即关注的一个问题是你没有从生成的进程中处理stdout / stderr。如果不这样做,很可能会阻止进程和进程本身的输出。有关详细信息,请参阅this answer。
答案 2 :(得分:0)
BufferedReader stdError = ..
..将被Eclipse标记为警告,因为它似乎没有被再次引用。这反过来表明错误流没有被消耗。这样做。
有关使用Process
的更多提示,请参阅runtime.exec info. page中链接的文章。另外,最好使用ProcessBuilder
,它可以合并System.out
和System.err
,这样可以更容易地使用一个循环来使用它们。