需求很简单:想知道远程 FTP 服务器什么时候有新文件,然后对这些文件做点什么——下载、处理、触发其他流程。问题在于 FTP 服务器不会主动推送通知,它只是在那里等着。必须由你主动去查。

解决这个问题有两种方式。第一种需要终端和 Shell 脚本知识,出了问题也不容易察觉。第二种什么都不需要。

麻烦的方式:Shell 脚本加 cron

问系统管理员怎么监控 FTP 文件夹,得到的答案通常是 lftp——一个命令行 FTP 客户端——配合 cron 定时任务或 launchd 代理定期运行。

典型配置是这样的。先写一个 Shell 脚本,用 lftp 将远程文件夹镜像到本地:

#!/bin/bash
# ftp-sync.sh
lftp -u 用户名,密码 ftp.example.com << EOF
mirror --only-newer --no-recursion /remote/folder /Users/you/Downloads/ftp-watch/
quit
EOF

然后用 cron(crontab -e)设置每 5 分钟执行一次:

# 每 5 分钟同步一次 FTP
*/5 * * * * /Users/you/scripts/ftp-sync.sh >> /tmp/ftp-sync.log 2>&1

这个方案能跑。配置正确且保持正确的情况下,每 5 分钟检查一次服务器,有新文件就下载。

但这种方式有几个实际问题:

对于习惯终端、偏好代码而不是图形界面的开发者来说,这或许可以接受。对其他人,或者对可靠性和反馈有要求的工作流来说,这不是合适的工具。

简单的方式:FTPull

FTPull 是一款 macOS 应用,持续监控远程 FTP 文件夹并自动下载新文件。底层逻辑和脚本方案一样——定期轮询服务器——但脚本方案的所有问题都被解决了。

开始监控 FTP 文件夹的步骤:

  1. 安装 FTPull,从应用程序文件夹启动,菜单栏会出现图标。
  2. 打开设置,添加新连接:主机名、端口、用户名、密码、协议(FTP/SFTP/FTPS)。
  3. 设置远程文件夹路径——服务器上你要监控的目录。
  4. 设置本地文件夹——下载的文件保存到 Mac 的哪里。
  5. 设置轮询间隔——FTPull 检查服务器的频率。需要即时响应设 1 分钟,想减少网络流量设 5 分钟。
  6. 启用连接,FTPull 立即开始轮询。

就这些。之后 FTPull 全自动处理。服务器有新文件时,下次轮询检测到就会下载,并发送 macOS 通知。

FTPull 监控什么

FTPull 将当前文件列表与上次轮询的列表对比,发现新内容就下载。具体来说:

文件类型过滤

只关心特定类型的文件——比如数据源的 .csv 或处理系统的 .pdf——设置扩展名过滤器,FTPull 会静默跳过其他所有文件。远程文件夹里混有你不需要的文件类型时特别有用。

多文件夹,多服务器

相比脚本方案,FTPull 的一个实际优势是多连接管理。需要同时监控 5 个不同的 FTP 服务器?在 FTPull 里添加 5 个连接,各自独立运行,统一由菜单栏的一个图标管理,每个连接有独立的轮询间隔和配置。

用 cron 实现同样的事情,意味着 5 个独立脚本、5 条 cron 记录、5 个没人看的日志文件。

定时计划

FTPull 内置计划功能,可以将监控限制在特定时间段和工作日。文件只在工作时间到达?没必要凌晨三点还在轮询。设置好时间范围(比如工作日 8:00–20:00),FTPull 在计划外自动暂停,减少不必要的网络请求和服务器负担。

出了问题怎么办

这是 FTPull 与脚本方案差异最明显的地方。下载失败时:

对比 cron 脚本:错误追加到没人看的日志里,其他什么都不发生,直到有人发现文件没到才知道出了问题。

脚本需要持续维护

Shell 脚本和 cron 任务没有界面、没有通知、没有错误恢复。凭据变了、服务器迁了、网络出问题——它们会静默失败,直到有人追问文件去哪了才能发现。

FTPull 把这一切都处理好了。配置一次,在后台持续运行,需要你注意的时候才会告诉你。