如何使用flock和文件描述符来锁定文件并写入锁定的文件?

如何使用flock和文件描述符来锁定文件并写入锁定的文件?

我有一个 bash 脚本,它发出 cURL 请求并将输出写入名为resp.txt.我需要创建一个独占锁,以便我可以写入该文件,而不用担心多个用户同时运行脚本和编辑文本文件。

以下是我期望锁定文件、执行请求并写入文本文件的代码:

(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt

这是解决这个问题的正确方法吗?我的实际脚本比这个长一点,但当我将flock语法添加到 bash 脚本时,它似乎中断了。

如果有人可以解释这些文件描述符是如何工作的,并让我知道我是否正确锁定了文件,那就太棒了!

答案1

这是不正确的,因为当您这样做时( flock -e 200; ... ) 200> file,您正在截断文件file 你就得到了独占锁。我认为你应该这样做:

touch resp.txt
(
  flock -e 200
  curl 'someurl' -H 'someHeader' > resp.txt
) 200< resp.txt

将锁锁定在以只读方式打开的文件上。

笔记。某些 shell 不支持大于 9 的文件描述符。此外,硬编码的文件描述符可能已被使用。使用高级 shell(bash、ksh93、zsh),可以执行以下操作:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)

相关内容