两个进程读写同一个文件是否需要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
可以写几个关键词,比如success
、fail
等
虽然许多程序员忽略了这一点,但您可能 运行 会遇到问题,因为写入文件不是原子操作。当作者做的时候
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"
我正在使用 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
可以写几个关键词,比如success
、fail
等
虽然许多程序员忽略了这一点,但您可能 运行 会遇到问题,因为写入文件不是原子操作。当作者做的时候
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"