Fash中的Flock和exec安全吗?


13

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

(
    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

我隐约记得执行进程保留了打开的文件描述符,并且由于flock使用文件描述符,它应该可以工作。但是我找不到任何可以使之明确和明确的文档。

作为记录,这特定于Linux。

Answers:


3

是的,锁保留在两端execexecve只要文件描述符保持打开状态,锁就会在基础系统调用中保留。execve除非已将文件描述符配置为在exec上关闭,否则它们始终保持打开状态,并且由外壳重定向创建的文件描述符未标记为close-on-exec。


6

是的。Exec只是替换了过程映像,但是它仍然是相同的过程,因此与其关联的OS级锁保持不变。

验证它是否有效很容易:

(
    flock -n 200 || exit 1;
    echo "locked"
    exec ./script
) 200>program.lock

脚本

sleep 100

尝试./lock在接下来的100秒内运行两次。您只会获得一次锁定,因此ergo exec不会释放该锁定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.