所以,我试图使用Flock和该文件的一行文本对文本文件进行独占锁定,但这样做会删除之前的文本。
( flock -n 200 || exit 1
echo "In critical section"
echo text >> file.txt
echo text added to file
) 200>file.txt
echo "After critical section"
所以如果文件让我们说
123
214
242
232
在运行脚本之后,我期待像
这样的东西123
214
242
232
text
相反,我得到的只是
text
为什么它会像这样,我的猜测是它正在替换原始文件,但我不确定。
答案 0 :(得分:2)
stdout(fd 1)未重定向到(fd 200),echo
命令被写入stdout。
200>file.txt
在执行子shell中的命令之前截断file.txt
echo text >> file.txt
追加text
使用>>
代替>
以附加模式打开文件。
f() {
( flock -n 200 || exit 1
echo "In critical section"
echo text >> file.txt
echo text added to file
) 200>>file.txt
echo "After critical section"
}
f & f & f & f ; wait
请注意,在临界区外面打开(截断/追加)。
否则要阻止直到锁定可用,请不要使用-n
,比较
f_fail() {
(
sleep 1
flock -n 200 || exit 1
pid=$(bash -c 'ps -p "$(ps -p $$ -oppid=)" -oppid=')
echo "$pid started"
echo text >& 200
echo "$pid done"
) 200>>file.txt
}
f_block() {
(
sleep 1
flock 200 || exit 1
pid=$(bash -c 'ps -p "$(ps -p $$ -oppid=)" -oppid=')
echo "$pid started"
echo text >& 200
echo "$pid done"
) 200>>file.txt
}
f_fail & f_fail & f_fail & f_fail & wait
f_block & f_block & f_block & f_block & wait
答案 1 :(得分:1)
那是因为你有
200>file.txt
在第5行。它覆盖了文件。