当我在单独的进程中执行命令时,例如使用 Runtime.getRuntime().exec(...)
方法,其 JavaDoc 指出:
Executes the specified command and arguments in a separate process.
知道该进程将一直存在到 Java 程序存在之前,我需要如何处理来自该进程的流? (这是一个细节,但 Java 程序负责杀死这个进程,并且该进程本身有一个内置的安全性,如果它注意到生成他的 Java 程序不再运行,它就会杀死自己)。
如果我们认为这个过程根本不产生任何输出(例如,因为所有错误消息和标准输出都被重定向到/dev/null 并且所有通信都是使用文件/套接字/任何东西完成的),我需要做什么输入流?
我应该让一个(或两个?)Java 线程免费运行,尝试读取 stdout/stderr 吗?
处理从根本不产生 stdout/stderr 的 Java 程序生成的长期存在的外部进程的正确方法是什么?
编辑
基本上,我将 shell 脚本包装在另一个 shell 脚本中,以确保将所有内容重定向到 /dev/null。我很确定如果我的“外部”shell 脚本(将所有内容重定向到/dev/null 的脚本)仍然会在 stdout 或 stderr 上生成任何内容,我的 Un*x 将不合规。然而,我发现令人难以置信的是,我会以某种方式“无缘无故”地在应用程序的生命周期中运行线程。真是令人费解。
最佳答案
如果一切都如你所说,那么你可能可以忽略它们。
然而,事情很少能如此顺利地进行。从长远来看,生成一个线程来拉取 stdout/stderr 可能是值得的,以防万一。当有一天它失败并真正推出一些东西时,就是你需要知道结果的那一天。 1 或 2 个线程(我认为只用一个线程就可以完成)不会是很大的开销。特别是如果你是正确的并且这些流中没有任何结果。
关于java - 如何处理来自外部进程的不需要的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4674179/