我们有一个共享文件夹,其中包含一些需要处理的文件。我们还有 3 台 UNIX 服务器,它们运行一个 shell 脚本,每次都获取并处理一个文件。在脚本结束时,文件被移走。3 UNIX 服务器不相互通信,它们彼此不认识。
在您看来,保证每个文件将处理一次而不会引发并发访问问题\错误的最佳方法是什么?
因此,您需要某种类型的文件锁定机制。一些可能性:
- 您可以为每个工作中的文件创建一个临时锁定文件。例如,对于文件
name.ext
,您需要创建一个name.ext.lock
,就在开始处理之前。如果此文件已经存在 - 此外,创建失败并显示"文件存在",这意味着有人已经在处理它,因此您不应该对它做任何事情。 - 其次,您可以使用咨询锁。咨询锁定尚未适用于每种类型的文件共享,并且它们只有 libc 级别的接口,因此您无法从 shell 脚本中使用它们。我建议深入研究 libc api 调用
flock
手册。 - 第三,这是最难的,而且是深深的Unix特有的。这是强制性的锁。强制锁定意味着锁即使对进程也有效,而进程对它们一无所知。您可以在此处阅读有关它们的更多信息: Linux 上的强制文件锁定
在我的位置上,我做了第一个,如果我可以修改处理的工作方式(例如,如果我可以用脚本挂钩它们,甚至我正在开发处理脚本)。如果没有,您可能需要第三个,尽管它并不总是有效。