启动流程而不消耗其输出

时间:2012-01-04 19:22:59

标签: java process stdout processbuilder

我用这行来从java应用程序执行python脚本:

Process process = Runtime.getRuntime().exec("python foo.py", null, directory);

该脚本运行与我的Java应用程序和其他客户端通信的TCP服务器。

当我调试脚本时,我在这里和那里有一些控制台打印,一切都很好。一旦从Java代码启动脚本,在一段固定时间后我的TCP服务器没有响应。经过一段时间的调试和挫折后,我从脚本中删除了我的打印件,一切都按预期工作。

似乎为进程的标准输出和错误流分配了一些内存,如果不使用它,则在尝试写入完整缓冲区时进程会卡住。

如何启动流程以便我不必使用标准输出流?我想保留打印件以进行调试,但是不想启动一个读取我不需要的流的线程。

3 个答案:

答案 0 :(得分:2)

您必须使用子进程的输出,否则最终会阻塞,因为输出缓冲区已满(不要忘记stderr)。如果你不想修改你的Java程序来使用它,也许你可以在脚本中添加一个标志来完全关闭调试,或者至少将它指向一个文件(可能是/dev/null)。

答案 1 :(得分:1)

Java公开了ProcessBuilder。这是您可以用来执行您想要的东西的东西。这可以执行fork-exec,还可以处理输出和错误流。

您的进程挂起的事实不是因为java。这是一个标准问题,因为流已满并且没有人消耗它,因此您的进程被阻止。

尝试将ProcessBuilder与读取流的线程一起使用。

答案 2 :(得分:0)

我过去做了一些类似的事情,我将流程的退出重定向到与流程相关的特定文件日志。之后你可以看到发生了什么。你可以维护你的python脚本的痕迹。