Duc*_*her 1 linux bash file-descriptor flock
我有一个bash脚本,它发出一个cURL请求并将输出写入一个名为的文件resp.txt.我需要创建一个独占锁,以便我可以写入该文件,而不用担心多个用户同时运行脚本和编辑文本文件.
这是我希望锁定文件,执行请求和写入文本文件的代码:
(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?我的实际脚本比这个有点长,但是当我将flock语法添加到bash脚本时它似乎会中断.我的理解是,这会创建一个可以写入锁定文件的子shell.我只是不确定是否需要将文件描述符添加到curl请求中,如下所示:
curl 'someurl' -H 'someHeader' 200>resp.txt
Run Code Online (Sandbox Code Playgroud)
如果有人可以解释这些文件描述符是如何工作的,让我知道我是否正确锁定文件会很棒!
flock支持command参数(-c).在您的情况下,您可以使用以下一个班轮:
flock resp.txt -c "curl 'someurl' -H 'someHeader' > resp.txt"
Run Code Online (Sandbox Code Playgroud)
上面的命令试图获取一个独占(写)锁resp.txt.除非在另一个脚本锁定文件时才能获得锁,否则它会等待.
一旦获得锁定,它就会执行curl命令并再次释放锁定.
如果要在获取锁定时执行多个命令,我建议使用与您要写入的文件不同的锁定文件.
像这样:
(
flock -n 200 || exit 1
# commands executed under lock
sleep 3
cat <<< 'hello' > test.txt
) 200> /path/to/lockfile
Run Code Online (Sandbox Code Playgroud)
上面创建了一个子shell,()并/path/to/lockfile使用文件描述符号将该子shell的输出重定向到200.子shell将从基本shell继承文件描述符200.
在子shell内部flock尝试获取文件描述符的锁200.获取锁后,执行以下命令.