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