2015-05-30 110 views
4

的stdout中我有标准输出重定向到一个文件一个长期运行的进程。例如: - 标准输出的有没有办法刷新正在运行的进程

./my-script.sh > file.txt & 

部分仍缓存,但我想它刷新到文件中,前面看到的结果。有没有办法做到这一点?

回答

3

缓存由libc的处理。您可以使用stdbuf命令来更改缓冲区大小:

stdbuf -o0 ./my-script.sh > file.txt & 

-o0设置为标准输出缓冲区大小0。也许你也想为-e0标准错误。

+0

是的,但我的问题是关系到已经运行的程序。它会在这种情况下工作吗? –

+0

没有,上面的命令可以用来启动与修改缓冲区大小的程序,这将不利于该进程是否已经运行 – hek2mgl

+1

做到这一点帮助:http://superuser.com/a/770612/209716? (用GDB) – hek2mgl

0

您可以检查/proc/文件系统和改变的stdout文件描述符。例如:

[email protected] ~$ bash -c ' 
    while [ true ]; do echo "."; sleep .5; done 
' > ./myfile.txt & 
[1] 3816 
[email protected] ~$ ls -la /proc/3816/fd/1 
l-wx------ 1 gerard gerard 64 May 30 14:55 /proc/3816/fd/1 -> /home/gerard/myfile.txt 

你可以看到,标准输出被链接到我在命令行上指定的文件。如果你想改变它,你可以简单地链接到其他东西。

如果您想要重新路由此输出,您可以启动一个tee进程,将您正在观察的进程的标准输出符号链接到新进程的标准输入。基本上你可以用这种方法重新路由任何你想要的东西。

但是,这不是非常稳定,因为如果您在tee进程终止之前没有仔细恢复其stdout文件描述符,那么程序输出将会中断。

但这不是不可能的;)

+0

但是没有这些文件的('的/ proc/3816/FD/1','/家庭/杰拉德/ MYFILE .txt')包含那些仍然缓冲的数据。问题是关于仍然缓冲的数据。 –

+0

真的,对不起,我错过了那个笔记。 –

相关问题