我有一个Bash脚本需要在运行时锁定文件以进行独占读/写。在此期间,运行相同脚本的任何其他副本应该挂起,直到锁定被释放(这应该很快)。
#!/bin/bash
trap "rm -f /tmp/.lock; exit" 0 1 2 3 15
(
flock -x 100
# Stuff happens here...
) 100>/tmp.lock
这有点起作用。但不是在这些条件下:
此时,我收到错误:
rm: cannot remove '/tmp/.lock': Text file busy
我认为我是如何用陷阱清理的,所以任何帮助都会非常感激。谢谢!
答案 0 :(得分:4)
就不会尝试“清理”flock风格的锁文件。
请记住,锁定保存在 inode 上,而不是文件名。删除目录条目会将先前在该位置的inode与其名称分离,从而允许该名称引用不同的inode。
考虑以下情况:
应该将Flock文件锁定文件视为从文件系统命名空间到文件锁定命名空间的映射。这些映射不需要也不应该“清理”。您可能希望考虑操作系统的文件系统层次结构标准是否为这些文件提供了生存的位置,例如/var/lock
,或tmpfs
上的某个位置(其中“清理”将隐式发生 - 并且安全 - - 重启时。)