Unix 文件锁和事务

Unix 文件锁和事务,unix,pipeline,atomicity,file-locking,filelock,Unix,Pipeline,Atomicity,File Locking,Filelock,我正在编写一个非常简单的管道来处理上传的文件,我选择将管道的状态保存在文件系统中,而不是数据库中。管道本身非常简单,因为文件在临时位置进行处理,然后以原子方式移动到一个文件夹中,该文件夹指示管道的特定阶段已完成。一旦文件被移动到下一阶段的文件夹中,上一阶段的文件将被删除。管道是单个进程,一次只有一个进程处于活动状态,因此无需担心竞争条件或崩溃场景。在最坏的情况下,我们重复以前完成的工作,并浪费一些磁盘空间 问题在于管道的第一步。处理文件上载的服务器将文件移动到特定文件夹中,以使客户端可以访问该文

我正在编写一个非常简单的管道来处理上传的文件,我选择将管道的状态保存在文件系统中,而不是数据库中。管道本身非常简单,因为文件在临时位置进行处理,然后以原子方式移动到一个文件夹中,该文件夹指示管道的特定阶段已完成。一旦文件被移动到下一阶段的文件夹中,上一阶段的文件将被删除。管道是单个进程,一次只有一个进程处于活动状态,因此无需担心竞争条件或崩溃场景。在最坏的情况下,我们重复以前完成的工作,并浪费一些磁盘空间

问题在于管道的第一步。处理文件上载的服务器将文件移动到特定文件夹中,以使客户端可以访问该文件夹,同时在另一个文件夹中创建一个符号链接,以指示管道进程有工作要做。因为这里存在竞争条件,所以我使用文件锁来创建和删除符号链接。管道进程锁定符号链接、处理文件、删除符号链接并释放锁。除了创建符号链接外,上载过程执行相同的操作。这会考虑删除符号链接和创建符号链接之间的竞争条件,但这里仍然存在一个bug

在将文件移动到位后,但在创建符号链接以指示存在需要处理的文件之前,上载过程可能会崩溃。我想知道处理这个案子的最好办法是什么。理论上,我可以在上传过程开始时创建一个文件,然后在成功创建符号链接时将其删除,以表示成功创建符号链接,但这同样会导致与以前相同的锁定问题,因为有多个上传过程需要相互协调


有没有更简单的方法来处理上传过程崩溃的情况?

解决这类问题的通常方法是检查“过时”文件

如果锁文件的修改日期超过X秒,则假定创建该文件的进程已终止并将其删除

如果数据文件的修改日期超过X秒,则假定创建该文件的进程已终止并将其删除


如果你想要真正的安全,并且文件不是特别大,你可以让X变成像一天(60*60*24秒)一样可笑的东西

嗯。。。。在unix中,管道始终是由管道连接的多个进程,因此您可能以其他方式使用该术语?此外,如果只有一个程序实例(正在运行的进程)在处理文件,那么您不需要任何锁定或其他特殊的魔法。此外,锁定符号链接文件与锁定普通文件不同。另外,为什么您的上传过程会在两个简单的文件操作(重命名和符号链接)之间崩溃?因为系统崩溃和容错意味着这些崩溃。