的stdout中我有标准输出重定向到一个文件一个长期运行的进程。例如: - 标准输出的有没有办法刷新正在运行的进程
./my-script.sh > file.txt &
部分仍缓存,但我想它刷新到文件中,前面看到的结果。有没有办法做到这一点?
的stdout中我有标准输出重定向到一个文件一个长期运行的进程。例如: - 标准输出的有没有办法刷新正在运行的进程
./my-script.sh > file.txt &
部分仍缓存,但我想它刷新到文件中,前面看到的结果。有没有办法做到这一点?
缓存由libc的处理。您可以使用stdbuf
命令来更改缓冲区大小:
stdbuf -o0 ./my-script.sh > file.txt &
-o0
设置为标准输出缓冲区大小0
。也许你也想为-e0
标准错误。
您可以检查/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文件描述符,那么程序输出将会中断。
但这不是不可能的;)
但是没有这些文件的('的/ proc/3816/FD/1','/家庭/杰拉德/ MYFILE .txt')包含那些仍然缓冲的数据。问题是关于仍然缓冲的数据。 –
真的,对不起,我错过了那个笔记。 –
是的,但我的问题是关系到已经运行的程序。它会在这种情况下工作吗? –
没有,上面的命令可以用来启动与修改缓冲区大小的程序,这将不利于该进程是否已经运行 – hek2mgl
做到这一点帮助:http://superuser.com/a/770612/209716? (用GDB) – hek2mgl