【问题标题】:Why does flock removes existing text from a file?为什么flock会从文件中删除现有文本?
【发布时间】:2018-08-02 01:29:51
【问题描述】:

所以,我正在尝试使用 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

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

【问题讨论】:

    标签: linux bash shell flock


    【解决方案1】:
    • stdout (fd 1) 未重定向到 (fd 200),echo 命令被写入 stdout。

    • 200>file.txt 在执行 subshel​​l 中的命令之前截断 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
    

    【讨论】:

    • 看起来很像,将在标记为正确答案之前对其进行彻底测试。感谢您提供更多信息!
    【解决方案2】:

    那是因为你有

    200>file.txt
    

    在第 5 行。它会覆盖文件。

    【讨论】:

      猜你喜欢
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      相关资源
      最近更新 更多