我正在寻找有关shell脚本的帮助,以将命令的输出重定向到文件。我有一个C程序从串行端口和显示器读取输入。我希望将此数据重定向到文件。我正在通过调用
从java程序执行它Runtime r = Runtime.getRuntime();
Process procObj = r.exec("sh " + scriptfile);
我尝试将脚本文件编写为
./program >> file.txt
file.txt没有得到更新。在这里,程序不会结束,直到与端口的连接丢失,从某种意义上说它是无限运行的。所以我的程序一直在寻找端口上的数据,并在它出现时显示。 我只需要将相同的输出重定向到我将用作日志的文件。 我看了How to make shell output redirect (>) write while script is still running?但没有帮助。
请帮助......
答案 0 :(得分:2)
program
产生多少输出?使用标准IO重定向将在stdout
和file
之间添加4KB缓冲区。这意味着在OS开始写入文件之前,程序必须输出4KB以上的数据。
要解决此问题,请在“工作单位”完成时将stdout.flush()
添加到您的程序中(可能是一行但可能超过一行)。
答案 1 :(得分:1)
您可以试试./program >> file.txt 2>>file.txt
或./program 2>&1 >>file.txt
吗?
答案 2 :(得分:1)
试试这个
List<String> cmd = new ArrayList<String>();
cmd.add("sh");
cmd.add("-c");
cmd.add("program 1> file.txt 2>&1");
ProcessBuilder pb = new ProcessBuilder(cmd);
Process p = pb.start();
答案 3 :(得分:0)
如果您使用标准C调用输出(printf
,puts
等),您的输出可能会被缓冲。在C89及更高版本中,它取决于缓冲模式(无缓冲,完全缓冲,行缓冲)和缓冲区大小,是否根本缓冲输出以及刷新缓冲区时(请参阅http://www.gnu.org/software/libc/manual/html_node/Buffering-Concepts.html和{ {1}})。
默认情况下,在Linux上完全缓冲输出到文件。如果希望输出立即显示在输出文件中,您可以:
man setvbuf
fflush()
(write()
)man 2 write
(https://stackoverflow.com/a/7876756/601203)此行为与您通过shell脚本在Java程序中启动C程序的事实无关。此行为取决于您链接到程序中的标准C库。