如何确保已刷新文件中的回显?

use*_*185 6 bash shell-script

我有两个协作程序 X 和 Y 在同一系统上运行。X 有时使用 Y 来计算一些信息。我在程序之间使用基于文件的通信。当 X 要 Y 计算某事时,过程如下:

  1. X 将作业描述写入文件 job.txt 并将其放入共享目录。然后 X 开始轮询同一目录中是否存在文件 ready.txt。
  2. Y 轮询文件 job.txt 是否存在。当文件出现时,Y 首先从文件中读取作业信息并将其删除。然后 Y 执行作业并将结果放入 result.txt。最后 Y 创建一个文件 ready.txt 并再次开始轮询 job.txt 是否存在。
  3. 当X注意到ready.txt的出现时,它读取result.txt,删除ready.txt和result.txt,然后继续做其他事情。

问题是 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 条附加评论

  1. 我已经验证(例如,通过不删除 tmp_result.txt 然后检查它)问题不在于原始结果,而在于它们如何传输到 X。
  2. tmp_result.txt 和 result.txt 都驻留在基于 tmpfs 的 RAM 磁盘上,所以我希望复制/移动文件非常快。
  3. 我在开始使用tmpfs(最初所有文件都驻留在普通硬盘分区中)后首先遇到了这个问题。

Tho*_*mas 2

尝试将命令放在 和sync之间。cptouch ready.txt