不知道flock是如何工作的。需要一些澄清

时间:2015-02-11 15:51:06

标签: linux bash file-descriptor flock

我有一个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

如果有人可以解释这些文件描述符是如何工作的,请告诉我是否正确锁定文件会很棒!

1 个答案:

答案 0 :(得分:7)

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 (),并使用文件描述符编号/path/to/lockfile将该子shell的输出重定向到200。子shell将从基础shell继承文件描述符200。

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