我有一个java应用程序,它调用挂起的ksh脚本。后端的外观显示脚本对STDOUT
的写入过程已满并被阻止。 STDERR
应该是空的,我的java代码首先读取它。调试显示java应用程序挂起读取STDERR
输入流,这反过来导致脚本进程尝试向STDOUT写入更多内容以阻止。我认为STDERR
正被写入第二个(STDOUT
之后),所以它只是等到它看到输入(并且由于写入卡在STDOUT
上而无法接收输入)。 / p>
这个应用程序适用于多个Linux机箱(所有相同的操作系统和内核),除了一个。将每个输入流读入单独的线程可以解决此问题的问题。我知道STDERR
的linux默认值是非缓冲的,并且输入通常会立即写入。所以我认为可以将STDERR
设置为在此框中缓冲。我如何/在哪里找到它的价值?
答案 0 :(得分:1)
使用单个线程读取stderr和stdout是一个错误的想法,例如。 正确的解决方案是使用两个单独的线程。其他任何事情只是一场等待失败的竞争状态。
也许你对非阻塞的非缓冲感到困惑?使stderr非缓冲不会消除程序在任何时间点挂起的可能性(通过阻塞stderr或sdout)。