【发布时间】:2019-08-29 03:06:54
【问题描述】:
我们有一个构建脚本,可以为多种板卡类型构建嵌入式系统,当以一种方式捕获输出时,它似乎工作正常。另一种方式,它会部分通过输出,然后在继续之前截断文件。
工作方式:
time ( cd ~ ; builder.sh 2>&1 | tee ~/builder.out )
以及似乎截断的方式:
time ( cd ~ ; builder.sh > ~/builder.out 2>&1 )
截断似乎发生在一个非常特定的点,截断后文件中的第一行始终是来自qmake 的DEFAULT_INCDIRS=...。它位于过程中的特定点而不是文件达到一定大小时这一事实似乎表明它不是某些外部文件检查器进行截断。
在任何情况下,如果它被删除,脚本将继续写入已删除文件的 inode,直到它被关闭,然后它会删除该 inode。
实际发生的情况是文件似乎被截断,然后在开始时继续写入。但是如果程序实际上没有访问文件句柄本身,我就无法做到这一点。
在上述两种情况下,构建器脚本实际上并不知道它的输出文件,它只是将输出和错误消息写入stdout 并让shell 重定向处理它。
所以我的问题是:有没有办法在文件 I/O 的 UNIX 模型中做到这一点(比如来自 C 文件 API 调用)?换句话说,您可以在通过重定向设置时截断正在写入的文件吗?为什么tee 变体有效?是什么阻止它被截断?
【问题讨论】: