文件锁定似乎无效(flock/lockf)

1 投票
1 回答
886 浏览
提问于 2025-04-18 07:07

在我的项目中,我们有一些脚本用来启动应用程序,进行性能测试,然后再关闭应用程序。问题是,有时候脚本会出错,比如崩溃。这样一来,我们的应用程序就会“悬在空中”,无法正常关闭。

我想通过把应用程序的进程ID(pid)写入一个文件来解决这个问题,但我想做到更规范一些,所以我想尝试以下方法:

lock the file
process the pid/pids
clean file entries
unlock the file

接着,我开始查找如何在 Python 2.7 中锁定文件(因为我们用这个版本来写脚本),于是我发现了 https://docs.python.org/2/library/fcntl.html 以及 flocklockf 方法,但我觉得我可能做错了什么。

我想测试这些方法是否能正常工作,所以我做了:

echo "test" > testFile
(open repl)
>>> import fcntl
>>> f = open("testFile", "rw")
>>> fcntl.flock(f, fcntl.LOCK_EX)

即使我锁定了文件(或者至少我认为我锁定了),我仍然可以在另一个终端会话中执行

echo "aaa" >> testFile

而且成功了,文件被修改了,没有出现错误。

如果有操作系统特定的技巧我应该使用(不过我怀疑 Python 标准库不能以可移植的方式处理锁定),这个方法需要在 Linux 上有效。

1 个回答

4

默认情况下,文件锁是建议性的,这意味着它们只有在所有进程都配合的情况下才有效,也就是说,进程在进行输入输出操作之前会检查文件是否被锁定。但是,没有什么能阻止一个进程忽略这个建议锁,直接写入文件。

还有一种强制锁,系统会强制其他进程遵守这些锁。这可能是你想要的,建议你搜索一下“mandatory locks linux”来了解更多细节,主要涉及到用一些参数挂载相关的文件系统。

撰写回答