当使用特定的FTP客户端时,传入的FTP传输不会在lsof中显示

我有一个脚本,它不断监视一个FTP Dropbox目录,并在进入时处理新文件。脚本在每个文件上运行lsof ,然后再尝试处理它以确定文件是否仍在传输(某些文件很大,需要一段时间来转移),以避免处理不完整的文件。

除了这个特定的FTP客户端之外,一切工作都正常。 出于某种原因,当这个客户端上传一个文件到FTP服务器时,在文件上运行lsof什么也不返回。 我通过运行watch -n0.1 'lsof /path/to/file.txt' ,然后使用两个不同的FTP客户端上传'file.txt'到服务器来testing这个。 当用Cyber​​duck上传时,lsof返回有关打开文件的数据,当使用其他FTP客户端时,lsof不返回任何内容。 我不明白怎么可能(和FWIW,我用fuser命令得到相同的结果)。 我也正在运行watch -n0.1 'ls -l /path/to/file' ,可以看到客户watch -n0.1 'ls -l /path/to/file'在传输的文件大小,所以我知道客户watch -n0.1 'ls -l /path/to/file' 写入文件。

我知道有解决方法可以解决我的问题,但是我更关心的是,如果这个FTP客户端可以写入一个文件,而不关心系统,那么这个文件就不会被打开。 和想法?

我在Ubuntu Server 12.04 LTS上运行vsftp

更新:

事实certificate,当我早些时候使用Cyber​​duck进行testing时,我使用SFTP连接到FTP服务器,而不是FTP。 当我使用FTP上传一个带有Cyber​​duck的文件时,我遇到了同样的问题 – file upload,但在lsof没有任何显示。 我还使用Debian中的标准FTP客户端使用PUT和APPEND上传文件 – 同样的事情。

它看起来像所有的FTP上传(不pipe客户端)写入其各自的文件,而不用打开文件就系统而言。 我在另一个FTP服务器上testing了这个场景,并且所有的东西都按预期工作 – 当文件被上传的时候,它们显示为在lsof中打开。 所以,我的FTP服务器的具体configuration有问题。 我怀疑它与lsof和/或vsftpd的版本有关。 它们是旧版本,分别是4.81和2.3.2。

除了STOR(PUT)我们大多数人都知道并且会使用,一个相对不常见的FTP命令将数据上传到远程服务器是APPEND :

  APPEND (with create) (APPE) This command causes the server-DTP to accept the data transferred via the data connection and to store the data in a file at the server site. If the file specified in the pathname exists at the server site, then the data shall be appended to that file; otherwise the file specified in the pathname shall be created at the server site. 

可以允许客户添加到一个文件,而不保持它打开整个时间…