为什么flock会从文件中删除现有文本?

时间:2018-02-22 09:05:11

标签: linux bash shell flock

所以,我试图使用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

为什么它会像这样,我的猜测是它正在替换原始文件,但我不确定。

2 个答案:

答案 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行。它覆盖了文件。