java - 如何处理来自外部进程的不需要的流?

标签 java exec stdout stderr

当我在单独的进程中执行命令时,例如使用 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 的脚本)仍然会在 stdoutstderr 上生成任何内容,我的 Un*x 将不合规。然而,我发现令人难以置信的是,我会以某种方式“无缘无故”地在应用程序的生命周期中运行线程。真是令人费解。

最佳答案

如果一切都如你所说,那么你可能可以忽略它们。

然而,事情很少能如此顺利地进行。从长远来看,生成一个线程来拉取 stdout/stderr 可能是值得的,以防万一。当有一天它失败并真正推出一些东西时,就是你需要知道结果的那一天。 1 或 2 个线程(我认为只用一个线程就可以完成)不会是很大的开销。特别是如果你是正确的并且这些流中没有任何结果。

关于java - 如何处理来自外部进程的不需要的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4674179/

相关文章:

python - 如何检测控制台是否支持 Python 中的 ANSI 转义码?

linux - BASH:在后台运行 script.sh 并将该实例的 pid 输出到文件?

java - 同步方法不断被调用

java - Java如何实现字符串池?

java - 如何将 C 函数的值返回给 Java 调用者?

带引号的 PHP 执行

java - 从 Android 应用程序将数据发送到 Google 电子表格

c++ - 在c后台运行一个进程

c++ - Boost 中是否有跨平台执行程序?

string - 如何使用 Go 将格式化字符串打印到标准输出中的同一行?