如果Perl尝试在正在上传的文件上调用move(),会发生什么?

时间:2009-04-30 18:35:24

标签: linux perl ftp inode

有人正在将一个大小为10Mb的文件FTP到Linux服务器上的文件夹。 当文件处于转换状态时,cron会唤醒并触发Perl脚本,该脚本旨在查看ftp文件夹并将其找到的任何内容移动到某个备用文件夹。我正在使用File::Copy中的move()函数。 Perl进程实际上将文件重命名为其任务的一部分。这有关系,或者FTP不关心文件系统将文件描述为什么?

move()会成功并移动部分文件,让FTP做什么? 或者会移动失败并返回0?

3 个答案:

答案 0 :(得分:10)

不,移动应该让我们完成新位置的下载过程。您只是将inode从一个位置移动到另一个位置。下载程序中的打开文件描述符仍应指向它。

我只想重复一些其他人提到的内容。只有移动操作位于同一文件系统上时,此方法才有效。如果它作为另一个文件系统而不是inode无法传输,因为它总是属于同一个文件系统。最可能的情况是当时的部分数据被复制到新位置,而程序仍然在旧的inode中下载,而不再使用该文件因此无法使用。

答案 1 :(得分:5)

由于没有标准move,因此很难知道您的方案中发生了什么。如果您的意思是rename,那么您可能不会有任何问题,因为您的情况出现问题的主要方式是您将文件从一个文件系统移动到另一个文件系统(因此执行复制 - 和 - 删除,而不是真正的移动),并且在大多数系统rename将在这种情况下失败。 (所以,如果您的设置完全正常,那就没关系。)

如果您没有使用rename但某些move函数,例如,它将处理跨文件系统的移动,那么如果涉及多个文件系统,您最好可以使用部分文件。 (例如,如果您现在只在一个文件系统上,这可能会成为一个非常讨厌的问题,但是稍后您上传的这些文件占用了大量空间并且您添加了专用于存储它们的驱动器 - 现在你正在进行跨文件系统的移动。)

答案 2 :(得分:1)

我不确定,但很可能没有错。移动不会更改文件inode编号,因此FTP服务器根本不会注意到移动,并将继续写入新位置的文件。简而言之,move()将成功,上传将在新位置继续。

相关问题