【问题标题】:Not sure how flock works. Need some clarification不确定羊群是如何工作的。需要澄清一下
【发布时间】:2015-04-12 01:48:18
【问题描述】:

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

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

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

这是解决此问题的正确方法吗?我的实际脚本比这长一点,但是当我将flock 语法添加到 bash 脚本时,它似乎中断了。我的理解是,这会创建一个可以写入锁定文件的子shell。我只是不确定是否需要像这样将文件描述符添加到 curl 请求中:

curl 'someurl' -H 'someHeader' 200>resp.txt

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

【问题讨论】:

  • 为什么要将 curl 响应通过管道传输到文件中?
  • 当你添加这个时,你的脚本是如何“中断”的?
  • 因为我需要从响应中提取一个 ID 以在下一个请求中使用。我是否有理由不这样做,或者有更好的方法来完成同样的事情?基本上我有一些请求需要从中获取信息。我想我可以重写一些东西,它只是与 cURL 请求和诸如此类的东西变得很长。我可以使用| 并继续下一行的脚本吗?我虽然它必须在一条线上。
  • 这仍然不能告诉我什么坏了。你有错误吗?小猫会吃你的脸吗?
  • 所以问题是你添加flock时无法从resp.txt读取请求?我打赌curl 不能写入文件。尝试>&200,就像我在之前的评论中建议的那样,让它写信给flocked fd。此外,您不会相信人们多久会忽略他们收到的错误消息文本。我的意图不是在那里侮辱你。

标签: linux bash file-descriptor flock


【解决方案1】:

flock 支持 command 参数 (-c)。您可以在您的情况下使用以下一种衬垫:

flock resp.txt -c "curl 'someurl' -H 'someHeader' > resp.txt"

上述命令尝试为resp.txt 获取排他(写)锁。如果另一个脚本锁定了文件,则它会等待,除非可以获得锁定。

一旦获得锁,它就会执行curl 命令并再次释放锁。


如果您想在获取锁的同时执行多个命令,我建议使用与您正在写入的文件不同的锁文件。

像这样:

( 
    flock -n 200 || exit 1
    # commands executed under lock 
    sleep 3
    cat <<< 'hello' > test.txt
) 200> /path/to/lockfile

上面创建了一个子shell (),并使用文件描述符号200将该子shell的输出重定向到/path/to/lockfile。子 shell 将从基本 shell 继承文件描述符 200。

在子 shell 内部,flock 尝试为文件描述符 200 获取锁。获得锁后执行以下命令。

【讨论】:

  • 是的,这就是我要找的。感谢您的帮助。
  • 如果您希望为后续命令保持锁定,这将无济于事。
  • @EtanReisner 是的,问题只是执行了一个命令。在这种情况下,您可以使用-c 命令。我可以举一个例子,如何将它与多个命令一起使用...
  • @hek2mgl,我将不胜感激!该文档提供了一个与我的问题类似的示例,但是对于 bash 脚本的初学者来说,它很难理解,因为手册页没有深入。
  • 抱歉,我差点忘记了 :) ...我暂时处于 AFK 状态。以后可以多解释...
猜你喜欢
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
相关资源
最近更新 更多