我们有一个共享文件夹,其中包含一些需要处理的文件。 我们还有 3 台 UNIX 服务器,它们运行一个 shell 脚本,每次获取并处理一个文件。在脚本末尾,文件已被移走。 3 个 UNIX 服务器彼此不通信,并且彼此不知道。
您认为保证每个文件都被处理一次而不引发并发访问问题\错误的最佳方法是什么?
最佳答案
或多或少您需要某种类型的文件锁定机制。一些可能性:
- 您可以为工作中的每个文件创建临时锁定文件。例如,对于文件
name.ext
,您需要在开始处理之前创建一个name.ext.lock
。如果此文件已经存在 - 另外,创建失败并显示“文件存在”,这意味着有人已经在处理它,因此您不应该对其执行任何操作。 - 其次,您可以使用咨询锁。建议锁定尚未适用于每种类型的文件共享,并且它们仅具有 libc 级接口(interface),因此您无法通过 shell 脚本使用它们。我建议深入研究
flock
libc api 调用的手册。 - 第三,它是最难的,并且是 UNIX 特定的。这是强制锁。强制锁定意味着即使对于不知道任何信息的进程,锁定也是有效的。您可以在这里阅读有关它们的更多信息:Mandatory file lock on linux
在你的位置,我做了第一个,如果我可以修改处理的工作方式(例如,如果我可以用脚本 Hook 它们,或者甚至我正在开发处理脚本)。如果没有,您可能需要第三个,尽管它并不总是有效。
关于file - 对文件的独占\同步访问(排队),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22912380/