flock & exec 在 bash 中安全吗?

Dan*_*nny 13 bash lock

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

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

PSk*_*cik 6

是的。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不会释放锁。


Gil*_*il' 3

是的,锁是跨exec. execve只要文件描述符保持打开状态,锁就会在底层系统调用中保留。文件描述符保持打开状态execve,除非它们已配置为在 exec 时关闭,并且由 shell 重定向创建的文件描述符不会标记为 close-on-exec。