我发现boilerplate flock(1)
code看起来很有希望。现在我想在盲目使用之前了解这些组件。
似乎这些函数使用的是flock
flock [-sxun] [-w timeout] fd
第三种形式在shell脚本中很方便,通常使用 以下方式:
(
flock -s 200
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
我迷失的部分(来自sample wrapper functions)就是这种符号
eval "exec $LOCKFD>\"$LOCKFILE\""
或以flock
联机帮助页
200>/var/lock/mylockfile
这取得了什么成果?
我注意到flock
的后续命令传递的值不是初始重定向中的值导致flock
投诉
flock: 50: Bad file descriptor
似乎flock
正在使用文件描述符作为地图来了解要操作的文件。为了使它能够工作,那些描述符必须仍然存在并与文件相关联,对吧?
重定向完成后,创建了锁文件,文件是否关闭,与打开文件关联的文件描述符是否已蒸发?我以为文件描述符只与打开的文件相关联。
这里发生了什么?
答案 0 :(得分:4)
200>/var/lock/mylockfile
这会创建一个文件/var/lock/mylockfile
,可以通过子shell内的文件描述符200写入。数字200是任意的。挑选一个较大的数字可以减少子shell中任何命令“注意到”额外文件描述符的可能性。
(通常,文件描述符0,1和2分别由stdin,stdout和stderr使用。这个数字可能低至3。)
flock -s 200
然后flock
用于通过先前创建的文件描述符锁定文件。它需要对>
200>
提供的文件的写访问权。请注意,在上面的重定向之后会发生这种情况。