我见过的“标准”锁定片段类似于......
(
flock -n 200 || exit 1;
# do stuff
) 200>program.lock
exec
那时使用是否安全(测试似乎是这样) ?子进程会保留锁吗?
(
flock -n 200 || exit 1;
exec /usr/bin/python vendors-notcoolstuff.py
) 200>program.lock
我依稀记得 exec'd 进程保留打开的文件描述符,并且由于集群使用文件描述符,所以它应该可以工作。但我找不到任何文件可以明确和明确这一点。
根据记录,这是特定于 Linux 的。
答案1
是的。 Exec 只是替换了进程映像,但它仍然是相同的进程,因此与其关联的操作系统级锁保持不变。
验证它是否有效非常容易:
锁
(
flock -n 200 || exit 1;
echo "locked"
exec ./script
) 200>program.lock
脚本
sleep 100
尝试./lock
在接下来的 100 秒内运行两次。你只会获得一次锁,因此exec
不会释放锁。
答案2
是的,锁是跨exec
.锁在底层系统调用中保留execve
,只要文件描述符保持打开状态。文件描述符保持打开状态,execve
除非它们已配置为在 exec 时关闭,并且由 shell 重定向创建的文件描述符不会标记为 close-on-exec。