我见过的“标准”锁定片段类似于......
(
flock -n 200 || exit 1;
# do stuff
) 200>program.lock
Run Code Online (Sandbox Code Playgroud)
那时使用是否安全(测试似乎是这样说的)exec
?子进程会保留锁吗?
(
flock -n 200 || exit 1;
exec /usr/bin/python vendors-notcoolstuff.py
) 200>program.lock
Run Code Online (Sandbox Code Playgroud)
我依稀记得 exec 的进程保留打开的文件描述符,并且由于 flock 使用文件描述符,它应该可以工作。但我找不到任何文件来明确和清楚地说明这一点。
作为记录,这是特定于 Linux 的。
是的。Exec 只是替换了进程映像,但它仍然是同一个进程,因此与其关联的操作系统级锁保持不变。
很容易验证它是否有效:
锁
(
flock -n 200 || exit 1;
echo "locked"
exec ./script
) 200>program.lock
Run Code Online (Sandbox Code Playgroud)
脚本
sleep 100
Run Code Online (Sandbox Code Playgroud)
./lock
在接下来的 100 秒内尝试运行两次。您只会获得一次锁,因此exec
不会释放锁。