为什么 flock 从文件中删除现有文本?
Why does flock removes existing text from a file?
因此,我正在尝试使用 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
为什么会这样,我的猜测是它正在替换原始文件,但我不确定。
那是因为你有
200>file.txt
第 5 行。它会覆盖文件。
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
注意临界区外的 open (truncate/append)。
否则阻塞直到锁可用不要使用-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
因此,我正在尝试使用 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
为什么会这样,我的猜测是它正在替换原始文件,但我不确定。
那是因为你有
200>file.txt
第 5 行。它会覆盖文件。
stdout (fd 1) 未重定向到 (fd 200),
echo
命令写入 stdout。200>file.txt
在执行子 shell 中的命令之前截断 file.txtecho 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
注意临界区外的 open (truncate/append)。
否则阻塞直到锁可用不要使用-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