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

标签 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

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

最佳答案

  • stdout (fd 1) 不会重定向到 (fd 200),echo 命令会写入 stdout。

  • 200>file.txt 在执行子 shell 中的命令之前截断 file.txt

  • 回显文本 >> 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

关于linux - 为什么flock会从文件中删除现有文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48923330/

相关文章:

linux - 如何从 shell/bash 脚本中更改 linux 上的桌面墙纸

c - 使用管道在进程之间同步文件写入

linux - 错误 : "grep: Argument list too long"

linux - 如何退出psql中的查询结果查看器?

linux - 在 shell 脚本中,如何在执行到标准输出(不是标准错误)时回显 shell 命令?

linux - 连接两个数字卡和 Asterisk 盒时出现 IRQ 问题

从 SIGINT 句柄调用一个复杂的函数 - 什么时候可以?

linux - 运行影响父 shell 的 bash 命令

用于清理旧备份文件的 Bash 脚本

bash - 在 shell 编程中打印双引号