我有两个协作程序 X 和 Y 在同一系统上运行。X 有时使用 Y 来计算一些信息。我在程序之间使用基于文件的通信。当 X 要 Y 计算某事时,过程如下:
问题是 X 有时只收到一个空的或部分结果文件。Y 使用的 bash 脚本目前执行如下操作:
rm -f tmp_result.txt
for ((i=first; i <= last; i++)) # Each iteration produces 1 or more result lines
do
# Compute something...
echo "One result line with e.g. $values" >> tmp_result.txt
done
cp tmp_result.txt result.txt
touch ready.txt
Run Code Online (Sandbox Code Playgroud)
也就是说,使用 echo 和 I/O 重定向将结果文件的内容一次一行打印到一个临时文件中。当内容准备好(或应该准备好!)时,它们被复制到最终的 result.txt 文件中,并通过创建 ready.txt 来通知 X。
即使经过相当广泛的实验和谷歌搜索,我仍然无法找到一种方法来确保 X 始终收到完整的结果。也许 100 次中有 1 到 5 次,X 会将 result.txt 视为完全空的(最常见的情况)或仅包含部分结果。
关于脚本逻辑的一些说明:我最初将结果行直接回显到 result.txt,但这非常不可靠(也许 2 个结果中有 1 个不完整)。然后我改为首先将这些行回显到 tmp_result.txt 中,然后将 tmp_result.txt 移动(重命名)到 result.txt 中。这可能导致十分之一的结果不完整。如上所示,复制文件效果最好,但偶尔仍会失败。
那么如何确保在 X 开始读取文件之前所有回显的行都已正确复制到 result.txt 中?Y 只有一些核心 bash 工具可用。
编辑: 2 3 条附加评论