Linux 如果Perl试图对正在上载的文件调用move(),会发生什么情况?

Linux 如果Perl试图对正在上载的文件调用move(),会发生什么情况?,linux,perl,ftp,inode,Linux,Perl,Ftp,Inode,有人正在将一个10Mb大小的文件FTPing到linux服务器上的文件夹中。 当文件处于转换状态时,cron会唤醒并触发一个Perl脚本,该脚本用于查看ftp文件夹,并将在那里找到的内容移动到某个备用文件夹。我正在使用中的move()函数。Perl进程实际上将重命名文件作为其任务的一部分。这很重要,还是FTP不关心文件系统对文件的描述 move()是否会成功移动部分文件,让FTP做什么? 或者移动将失败并返回0 不,move应该让您在新职位上完成下载过程。您只是将inode从一个位置移动到另一个

有人正在将一个10Mb大小的文件FTPing到linux服务器上的文件夹中。 当文件处于转换状态时,cron会唤醒并触发一个Perl脚本,该脚本用于查看ftp文件夹,并将在那里找到的内容移动到某个备用文件夹。我正在使用中的
move()
函数。Perl进程实际上将重命名文件作为其任务的一部分。这很重要,还是FTP不关心文件系统对文件的描述

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

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


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

我不确定,但很可能不会发生任何错误。移动不会更改文件索引节点号,因此FTP服务器根本不会注意到移动,并将继续在新位置写入文件。简而言之,
move()
将成功,上传将在新位置继续。

由于没有标准的
move
,因此很难知道您的场景中发生了什么。如果您的意思是
重命名
,那么您可能不会遇到任何问题,因为您的情况出现问题的主要方式是将文件从一个文件系统移动到另一个文件系统(因此进行复制和删除,而不是真正的移动),而在大多数系统上
重命名
在这些情况下都会失败。(因此,如果您的设置工作正常,就可以了。)


如果您没有使用
rename
,而是使用一些
move
函数,例如,这些函数将处理跨文件系统的移动,那么如果涉及多个文件系统,您很可能会得到一个部分文件。(例如,如果您现在都在一个文件系统上,那么这可能会成为一个非常棘手的问题,但稍后您上载的这些文件会占用大量空间,您会添加一个专用于存储它们的驱动器,而现在您正在进行跨文件系统移动。)

我使用的是perl move函数,我认为它只是一个包装器,围绕着>mv-src-dest,特别是代码是move($ftpDir$infle“,$someOtherDir$newFileName”);如果它是系统/bin/mv的包装器,那么当且仅当您跨文件系统(现在或将来)移动时,您绝对会面临部分文件的危险。但只要文件系统是相同的,您就同意没有任何危害?对。但是请记住我原始答案的最后一个插入句。perl没有“move”关键字,但它有“rename”关键字。如果您正在调用一个名为“move”的函数,它可能是File::Copy模块导出的&move子例程。如果是这样的话,看看File::Copy文档会很有帮助。重命名这些文档并不重要,因为它不会更改inode。在文件系统中,名称与索引节点相关联。关于您的问题,移动和重命名几乎相同。使用旧文件名的新文件将只包含另一个inode,不会有问题。以防万一,这将是您的下一个问题:)警告:如果您跨文件系统移动,上载将完成,但您将无法访问该文件,因为不存在对inode的引用。您将在另一个文件系统中得到一个部分文件。感谢您投票支持我的问题!:)与Windows IMHO不同,Linux最大的特点之一是,你可以做一些事情来打开文件,比如移动、重命名,甚至删除文件,而打开这些文件的应用程序将被忽略。您甚至可以在程序运行时删除它们,它们将继续正常运行(但一旦退出,您将永远无法恢复它们…)什么是move(),它将东西移动到哪里?它是否可能复制文件而不只是重命名它们?拼写为“cron”,而不是“chron”