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

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

我有一个脚本,它可以持续监视 FTP dropbox 目录并在有新文件进入时进行处理。该脚本lsof在尝试处理每个文件之前会对其进行运行,以确定文件是否仍在传输(某些文件很大,需要一段时间才能传输)以避免处理不完整的文件。

一切都运行良好,除了这个特定的 FTP 客户端。出于某种原因,当此客户端将文件上传到 FTP 服务器时,lsof在文件上运行不会返回任何内容。我通过watch -n0.1 'lsof /path/to/file.txt'使用两个不同的 FTP 客户端运行并将“file.txt”上传到服务器来测试这一点。使用 Cyber​​duck 上传时,lsof 返回有关打开文件的数据,使用其他 FTP 客户端时,lsof 不会返回任何内容。我不明白这是怎么回事(而且,FWIW,我使用该fuser命令得到了相同的结果)。我也在运行watch -n0.1 'ls -l /path/to/file',可以看到文件的大小随着客户端的传输而变化,所以我知道客户端写入文件。

我知道有办法解决我的问题,但我更感兴趣的是,就系统而言,FTP 客户端究竟如何写入文件而无需“打开”该文件。有什么想法吗?

我在 Ubuntu Server 12.04 LTS 上运行 vsftp

更新:

事实证明,当我之前使用 Cyber​​duck 测试时,我使用 SFTP 而不是 FTP 连接到 FTP 服务器。当我使用 FTP 通过 Cyber​​duck 上传文件时,我遇到了同样的问题——文件上传了,但什么都没有显示lsof。我还使用 Debian 中的标准 FTP 客户端使用 PUT 和 APPEND 上传文件——同样,同样的事情。

看起来所有 FTP 上传(无论客户端如何)都会写入其各自的文件,而就系统而言不会“打开”文件。我在另一台 FTP 服务器上测试了这种情况,一切都按预期工作 - 当文件上传时,它们在 lsof 中显示为打开。因此,我的 FTP 服务器的特定配置有问题。我怀疑这与 lsof 和/或 vsftpd 的版本有关。它们是较旧的版本,分别是 4.81 和 2.3.2。

答案1

除了我们大多数人知道和会使用的 STOR(PUT)之外,一个相对不常见的用于将数据上传到远程服务器的 FTP 命令是附加

     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.

可以允许客户端添加文件而不一直保持文件打开......

相关内容