我有一个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
如果有人可以解释这些文件描述符是如何工作的,请告诉我是否正确锁定文件会很棒!
答案 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
的锁。获得锁后,执行以下命令。