有没有办法刷新正在运行的进程的stdout

时间:2015-05-30 12:29:47

标签: linux bash stdout

我有一个长时间运行的进程,stdout被重定向到一个文件。 E.g:

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

部分stdout仍然被缓存,但我想将其刷新到文件,以便更早地查看结果。有办法吗?

2 个答案:

答案 0 :(得分:7)

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

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

-o0将stdout的缓冲区大小设置为0。对于stderr,你也可能想要-e0

答案 1 :(得分:1)

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

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

您可以看到stdout符号链接到我在命令行中指定的文件。如果您想要更改它,您只需将其链接到其他内容即可。

如果要重新路由此输出,可以启动tee进程,将您正在观察的进程的标准输出符号链接到新进程的标准输入。您可以通过这种方式重新路由任何您想要的东西。

但是,这不是很稳定,因为如果在tee进程终止之前没有小心地恢复其stdout文件描述符,则程序输出将被破坏。

但这并非不可能;)

相关问题