2

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

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

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

bash write.sh:

#!/bin/bash

echo 'success' > tmp.log


重击读取.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等。

4

2 回答 2

2

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

echo success > tmp.log

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

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

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

此外,由于阅读器每次都从头开始读取文件,因此您不必担心从前一个中断的位置开始读取。

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

于 2018-08-10T02:17:28.383 回答
1

至少从您的示例来看,它看起来并不read.sh真正关心写入的内容tmp.log,只是write.sh创建了文件。在这种情况下,read.sh只需要检查文件是否存在。

write.sh可以简单地

: > tmp.log

read.sh成为

until [ -e tmp.log ]; do
  sleep 3
done
echo "done"
于 2018-08-10T02:33:51.690 回答