我有一个长时间运行的进程,stdout被重定向到一个文件。 E.g:
./my-script.sh > file.txt &
部分stdout仍然被缓存,但我想将其刷新到文件,以便更早地查看结果。有办法吗?
答案 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文件描述符,则程序输出将被破坏。
但这并非不可能;)