我有一个bash脚本,它发出一个curl请求,并将输出写到一个名为resp.txt的文件中。我需要创建一个独占锁,这样我就可以写入该文件,而不必担心多个用户同时运行脚本和编辑文本文件。
下面是我希望锁定文件、执行请求并写入文本文件的代码:

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

这样做对吗?我的实际脚本比这个长一点,但是当我向bash脚本添加flock语法时,它似乎中断了。我的理解是,这会创建一个可以写入锁定文件的子shell。我只是不确定是否需要像这样将文件描述符添加到curl请求:
curl 'someurl' -H 'someHeader' 200>resp.txt

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

最佳答案

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()并使用文件描述符编号将该子shell的输出重定向到/path/to/lockfile。子shell将从基本shell继承文件描述符200。
在子shell flock中,尝试获取文件描述符200的锁。获得锁后,执行以下命令。

关于linux - 不确定羊群的工作方式。需要澄清,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28458606/

10-16 23:58