两个进程读写同一个文件是否需要lockfile

Is lockfile necessary for reading and writing the same file of two processes

我正在使用 Bash 脚本并遇到这样的情况:

一个 bash 脚本会将内容写入文件,另一个 bash 脚本将从同一文件读取内容。

在这种情况下,是否需要lockfile?我想我不需要使用 lockfile 因为只有一个读取过程和一个写入过程但我不确定。

Bash write.sh:

#!/bin/bash

echo 'success' > tmp.log


Bash read.sh:

#!/bin/bash
while :
do
    line=$(head -n 1 ./tmp.log)
    if [[ "$line" == "success" ]]; then
        echo 'done'
        break
    else
        sleep 3
    fi
done

顺便说一句,write.sh可以写几个关键词,比如successfail

虽然许多程序员忽略了这一点,但您可能 运行 会遇到问题,因为写入文件不是原子操作。当作者做的时候

echo success > tmp.log

它可以分成两个(或更多)部分:首先它写 suc,然后它写 cess\n

如果 reader 在这些步骤之间执行,它可能只得到 suc 而不是整个 success 行。使用锁定文件可以防止这种竞争情况。

shell echo 命令的短写入不太可能发生这种情况,这就是为什么大多数程序员不担心它的原因。但是,如果编写器是使用缓冲输出的 C 程序,则可以在任意时间刷新缓冲区,这可能会以部分行结束。

此外,由于 reader 每次都从头读取文件,因此您不必担心从上一个文件停止的地方开始读取。

另一种方法是让作者写入一个不同名称的文件,然后将文件重命名为 reader 正在寻找的名称。重命名是原子的,因此您可以保证全部阅读或不阅读。

至少从你的例子来看,read.sh 似乎并不真正关心 什么 被写入 tmp.log,只有 [=14] =] 已创建文件。在这种情况下,所有 read.sh 需要检查的是文件是否存在。

write.sh 可以简单地是

: > tmp.log

并且read.sh变为

until [ -e tmp.log ]; do
  sleep 3
done
echo "done"