产卵终端读取它的标准

时间:2010-08-02 09:21:22

标签: java linux bash unix

我正在编写(在linux或windows + cygwin下)一个java程序,它需要运行一个命令(进程P1)并读取它的stdout(主要是对我的程序有用的二进制数据)。这很容易做,而且已经完成。

问题是P1还会在stderr上打印一些状态信息,我想生成一个终端(如xterm)以用户可读的方式显示它。 有没有简单的方法呢?

我考虑过只使用stderr的输出提供一些JTextArea的选项,但是这个程序使用了特殊的控制字符(特别是擦除最后一行)。不幸的是,我找不到任何“终端(J)组件”免费提供。

所以最简单的方法是能够打开一个xterm(P2),它显示在其窗口中到达stdin的所有内容,并启动一个java循环,在循环中执行err.read(P1) - > in.write(P2)传输从stderr(P1)到stdin(P2)的所有内容 另一个选择是能够启动类似“xterm -e P1_command”的东西,并且仍能捕获P1 stdout ......

非常感谢你的帮助!

PS:我希望保持尽可能多的便携性,所以我不确定进入/ dev / pts是个好主意

1 个答案:

答案 0 :(得分:2)

如果不完全理解你的问题,我能提出的最简单的解决方案就是这个(bash会用当前进程ID替换$$,使其成为半独特的)。我也不知道这是否适用于cygwin。

mkfifo /tmp/myoutput.$$
trap "rm /tmp/myoutput.$$" EXIT

xterm -e cat /tmp/myoutput.$$ &

runProgram 2>/tmp/myoutput.$$

这会将stderr转储到fifo,这是由你的xterm中的cat读取的。

请注意,每当你关闭fifo时cat都会退出,所以如果你正在生成你的进程的多个实例,那么你需要一些其他的控制机制,然后可能有其他方法来解决它更简单。比如在xterm中运行整个事情(包括你的java程序),但我想由于某种原因这是不可能的,或者你已经尝试过了。

修改的:
我想最常见的方法是将信息转储到日志文件,tail就像这样:

touch /tmp/myprogram.log
xterm -e tail -f /tmp/myprogram.log &
runProgram 2>/tmp/myprogram.log

这应该始终有效,但如果尾部启动太慢,您可能会丢失日志消息(在尾部查找尾部的标记以在尾随之前回显整个文件)。将它与陷阱(和“唯一”文件名)结合使用以删除文件,您无需担心清理。

不在xterm中运行整个应用程序的原因是什么?