![使用特定 FTP 客户端时,传入的 FTP 传输不显示在 lsof 中](https://linux22.com/image/636542/%E4%BD%BF%E7%94%A8%E7%89%B9%E5%AE%9A%20FTP%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%97%B6%EF%BC%8C%E4%BC%A0%E5%85%A5%E7%9A%84%20FTP%20%E4%BC%A0%E8%BE%93%E4%B8%8D%E6%98%BE%E7%A4%BA%E5%9C%A8%20lsof%20%E4%B8%AD.png)
我有一个脚本,它可以持续监视 FTP dropbox 目录并在有新文件进入时进行处理。该脚本lsof
在尝试处理每个文件之前会对其进行运行,以确定文件是否仍在传输(某些文件很大,需要一段时间才能传输)以避免处理不完整的文件。
一切都运行良好,除了这个特定的 FTP 客户端。出于某种原因,当此客户端将文件上传到 FTP 服务器时,lsof
在文件上运行不会返回任何内容。我通过watch -n0.1 'lsof /path/to/file.txt'
使用两个不同的 FTP 客户端运行并将“file.txt”上传到服务器来测试这一点。使用 Cyberduck 上传时,lsof 返回有关打开文件的数据,使用其他 FTP 客户端时,lsof 不会返回任何内容。我不明白这是怎么回事(而且,FWIW,我使用该fuser
命令得到了相同的结果)。我也在运行watch -n0.1 'ls -l /path/to/file'
,可以看到文件的大小随着客户端的传输而变化,所以我知道客户端是写入文件。
我知道有办法解决我的问题,但我更感兴趣的是,就系统而言,FTP 客户端究竟如何写入文件而无需“打开”该文件。有什么想法吗?
我在 Ubuntu Server 12.04 LTS 上运行 vsftp
更新:
事实证明,当我之前使用 Cyberduck 测试时,我使用 SFTP 而不是 FTP 连接到 FTP 服务器。当我使用 FTP 通过 Cyberduck 上传文件时,我遇到了同样的问题——文件上传了,但什么都没有显示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.
可以允许客户端添加文件而不一直保持文件打开......