有人可以解释如何使用flock和文件描述符来锁定文件并写入锁定的文件吗?


14

就我这个flock工具的新手来说,我还是裸着我,据我所知,我还没有使用过文件描述符。

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

这是我希望锁定文件,执行请求并写入文本文件的代码:

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

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

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

Answers:


8

这是不正确的,因为当您执行时( flock -e 200; ... ) 200> file,您将file 获得排他锁之前将文件截断。我认为您应该这样做:

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

将锁定设置为以只读方式打开的文件。

注意。有些外壳程序不支持大于9的文件描述符。此外,可能已经使用了硬编码的文件描述符。使用高级shell(bash,ksh93,zsh),可以完成以下操作:

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

我确实需要curl命令将写入文件。我误会如何flock运作吗?我是文件描述符的
新手

1
@DuckPuncher锁定机制与您可以对文件执行的读写操作是分开的。这样,curl仍然可以写入文件。请注意,这对于NFS可能是不安全的(甚至可能无法使用),但是请不要使用Shell脚本通过NFS进行文件锁定。使用bash,您还可以打开文件进行读取和写入:200<> resp.txt但这不会更改任何内容。
vinc17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.