【问题标题】:Bash script: make sure files are written and accessible before continuingBash 脚本:确保文件已写入并可访问,然后再继续
【发布时间】:2023-03-27 09:09:02
【问题描述】:

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

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

有时会打印出正确的结果,即1.00,有时会打印出0.00。我相信这是因为硬盘驱动器上的文件更新速度不够快。我在科学集群前端运行这个脚本,它并不总是表现顺利,即在打印目录等之前输入ls 时有时会滞后(这是因为一些 d***heads 在其上运行他们的 Matlab 脚本,但那是另一回事了……)。

我的问题是:如何确保由我的脚本动态编写的所有文件都可用于最新版本的同一脚本?也就是说,我想确保在echo "1 2 3" > file 之后立即执行的命令将看到file 有效地包含1 2 3,无论它之前包含的内容是否存在。

【问题讨论】:

  • 你有任何子进程/任何东西同时运行吗?我认为仅凭您提供的代码,您的具体示例是不可能的。
  • 没有其他运行。我不明白你所说的“我的具体例子是不可能的”是什么意思。
  • 运行它的工作目录是什么类型的文件系统? NFS?集群文件系统之一?分布式文件系统?
  • 这种行为会破坏很多程序,通常不会发生。更可能的问题是: 1. 在不同的线程或机器上运行不同的步骤,或者针对不同的挂载点。 2. 代码中的错误。
  • @twalberg:我们的集群手册说:“所有计算节点和前端都连接到 DDN SFA10k 存储系统:在 /triton 目录下交叉挂载 Lustre 文件系统的大型磁盘阵列. 该系统为最终用户提供了大约 430TB 的可用磁盘空间。”我对文件系统了解不多,但是这个“交叉安装”的东西可能是原因吗?

标签: bash filesystems cluster-computing


【解决方案1】:

当您的 bash 脚本开始读取和处理文件时,确保一致性已经为时已晚。

我建议对正在写入 bash 脚本读取的文件的进程进行一些代码更改...

例如,如果源进程将所有内容写入file.tmp 并且仅在完成后,它所做的最后一件事就是从@987654323 重新命名(2) (http://linux.die.net/man/2/rename‎) @ 到 file.txt -- 那么你的 bash 脚本就会知道 file.txt 是完整的。

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

【讨论】:

    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2017-08-19
    • 2015-04-24
    相关资源
    最近更新 更多