将用户输入作为文件处理的策略

时间:2010-05-24 16:51:12

标签: unix file concurrency

我正在创建一个脚本来处理我们的用户提供给我们的文件。一切都发生在同一个UNIX系统(在Solaris 10上运行)

现在我们的设计就是这个

  1. 用户将文件放入上传目录
  2. 脚本放在cron上,每10分钟运行一次。
  3. 脚本在上传目录中查找文件,处理它们,然后立即删除
  4. 由于历史/遗留原因,#1无法更改。此外,还需要在处理后删除文件。

    我主要关心的是并发性。当输入文件仍在写入时,分析脚本运行的情况很可能会出现。在这种情况下,数据将丢失,这(显然)是不可接受的。

    由于我们无法控制用户选择的放置输入文件的方法,因此我们不能要求它们获取文件锁定。据我了解,文件锁仅在UNIX上是 Advisory 。因此,用户必须选择遵守它们。

    我正在寻找有关处理此问题的最佳做法的建议。感谢

1 个答案:

答案 0 :(得分:1)

显然,所有最佳解决方案都涉及客户端提供某种触发器,表明它已完成上传。这可能是第二个文件,在将文件写入阶段目录或REST Web服务之后将文件原子移动到处理目录。我将假设您无法控制您的客户,并且无法或不愿意更改任何有关他们的信息。

在这种情况下,您仍有几个选择:

  • 您可以使用非常简单的启发式方法:检查文件大小,等待5秒,检查文件大小。如果它没有改变,那可能是好的。

  • 如果您拥有超级用户权限,则可以使用lsof确定是否有人打开此文件进行撰写。

  • 如果您有权访问处理上传的内容(HTTP,FTP,复制文件的setuid脚本?),您当然可以在其中放置触发器。