在 bash 中,flock 和 exec 安全吗?

在 bash 中,flock 和 exec 安全吗?

我见过的“标准”锁定片段类似于......

(
    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。

相关内容