file - 对文件的独占\同步访问(排队)

标签 file unix concurrency queue aix

我们有一个共享文件夹,其中包含一些需要处理的文件。 我们还有 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/

相关文章:

javascript - 无法将 document.execCommand ('copy' )与输入类型文件一起使用

regex - 正则表达式替换以构建文件中的版本

makefile - 使用 GNU Make 查找 Unix 以自动更新文件

linux - 关于 grep 命令

java - 从另一个线程调用一个线程的方法会暂停线程执行吗?

c# - 锁定/并发问题

android - File.separatorChar 是基于操作系统、区域设置还是其他什么?

JAVA:InputStream.read中的字节数组分配(byte[] b, int off, int len)

c# - 从 xml 文件生成 xmldocument 对象的最快方法

mysql - Rails 数据库中并发请求的唯一性处理