【发布时间】:2016-02-14 01:09:51
【问题描述】:
我正在编写一个程序,我想在后台启动一个 shell,并发送和接收输入和输出。我已经设法做到这一点,并且可以成功地读写这个过程。这就是我遇到麻烦的地方。
我想在ShellManager(见下面的代码)中有一个方法,它会一直等到进程完成/失败,然后将输入返回给用户。
例如,如果我发送tar xzf something_that_will_take_a_while.tar.gz,
我可以在输出中看到它是如何花费时间的,然后回显:
]0;~
[32mMe@MyComputer [33m~[0m
我已经尝试阻塞线程直到收到]0;~,但这不起作用。 (从未返回)
我也试过\u001B,同样的问题:(
我不确定符号是什么,也找不到太多关于如何检测进程何时返回的信息。
这是我的代码:
package buildSystem.shell;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import base.TermConstants;
public class ShellManager {
private InputStream termOut;
private OutputStream termIn;
private ProcessBuilder build;
private Process main;
BufferedReader reader;
BufferedWriter writer;
public ShellManager() {
build = new ProcessBuilder(TermConstants.getShellLocation());
build.redirectErrorStream(true);
}
public void start() throws IOException {
try {
main = build.start();
termOut = main.getInputStream();
termIn = main.getOutputStream();
reader = new BufferedReader (new InputStreamReader(termOut));
writer = new BufferedWriter(new OutputStreamWriter(termIn));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void writeLine(String s) throws IOException {
writer.write(s);
writer.newLine();
writer.flush();
}
public String readNextLine() throws IOException {
return reader.readLine();
}
public void end() {
try {
writeLine("exit\n");
main.waitFor();
termOut.close();
termIn.close();
reader.close();
writer.close();
} catch (IOException | InterruptedException e) {
kill();
}
}
public void kill() {
main.destroyForcibly();
try {
termOut.close();
termIn.close();
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*THE PART I AM HAVING TROUBLE WITH:*/
public void waitForReturn() {
try {
while(reader.readLine() != "\u001B") {}
} catch (IOException e) {
e.printStackTrace();
}
}
}
基本上,我想要一种可靠的方法来检测程序何时从 bash shell 退出。 bash 进程仍将运行,但从该 bash 实例运行的程序将返回。因此我不能使用process.waitFor()。
我尝试等待]0;~,然后等待[32mMe@MyComputer [33m~[0m,直到 tar 退出并出现错误代码,在这种情况下,这两行将被颠倒。我不确定如何继续,因为检测 bash 已返回给用户应该是一项相对容易的任务。
感谢您的帮助!
【问题讨论】:
-
您必须在调用
waitFor()之前关闭流。否则你就会陷入僵局。
标签: java linux bash shell process