Bash脚本:确保在继续之前编写和访问文件

时间:2014-04-10 14:31:56

标签: bash filesystems cluster-computing

我正在运行一个执行各种操作的bash脚本:读取文件,写入文件,从键盘输入,执行外部(非bash)代码等。我注意到即使使用相同的输入,结果也是如此并不总是一致的。非常简洁,想象一下如果下面的代码(在实践中它更复杂):

echo "1 2 3" > file
awk '{printf "%.2f\n", $1}' file

有时会打印正确的结果,即1.00,有时会打印0.00。我相信这种情况正在发生,因为硬盘驱动器上的文件更新速度不够快。我在一个科学的集群前端上运行这个脚本,它并不总是表现得很顺利,即在打印目录之前键入ls等时有时会滞后(这是因为有些人在运行他们的Matlab脚本时)它,但那是另一个故事......)。

我的问题是:我怎样才能确保我的脚本动态编写的所有文件都可用于最新版本的同一个脚本?也就是说,我想确保在echo "1 2 3" > file之后立即执行的命令会看到file实际上包含1 2 3,无论它在是否存在之前包含什么。

1 个答案:

答案 0 :(得分:-1)

当你的bash脚本开始阅读和处理文件时,确保一致性已经太晚了。

我建议将一些代码更改为哪个进程正在编写bash脚本读取的文件...

例如,如果源代码流程在完成时将所有内容写入file.tmp,则最后一件事就是reaname(2)(http://linux.die.net/man/2/rename)从file.tmpfile.txt - 然后您的bash脚本会知道file.txt已完成。

如果源处理连续记录,那么他们可能想要考虑日志轮换(更大的蠕虫),并确保您的bash后处理仅指向旋转的文件而不是活动文件。