需求很简单:想知道远程 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 分钟检查一次服务器,有新文件就下载。
但这种方式有几个实际问题:
- 没有通知。文件下载到文件夹了,你不知道——除非去手动看。
- 出错不吭声。密码改了、服务器迁移了、网络抖动——脚本静默失败,等有人问起"文件怎么没收到"才发现。
- 没有界面。排查问题要去翻日志文件,查状态要敲命令。
- 需要持续维护。macOS 更新可能破坏 cron 或 launchd 配置,凭据要在脚本里明文管理。
- 没有错误处理。下载失败或连接超时只是在日志里多一行——前提是有人在看日志。
对于习惯终端、偏好代码而不是图形界面的开发者来说,这或许可以接受。对其他人,或者对可靠性和反馈有要求的工作流来说,这不是合适的工具。
简单的方式:FTPull
FTPull 是一款 macOS 应用,持续监控远程 FTP 文件夹并自动下载新文件。底层逻辑和脚本方案一样——定期轮询服务器——但脚本方案的所有问题都被解决了。
开始监控 FTP 文件夹的步骤:
- 安装 FTPull,从应用程序文件夹启动,菜单栏会出现图标。
- 打开设置,添加新连接:主机名、端口、用户名、密码、协议(FTP/SFTP/FTPS)。
- 设置远程文件夹路径——服务器上你要监控的目录。
- 设置本地文件夹——下载的文件保存到 Mac 的哪里。
- 设置轮询间隔——FTPull 检查服务器的频率。需要即时响应设 1 分钟,想减少网络流量设 5 分钟。
- 启用连接,FTPull 立即开始轮询。
就这些。之后 FTPull 全自动处理。服务器有新文件时,下次轮询检测到就会下载,并发送 macOS 通知。
FTPull 监控什么
FTPull 将当前文件列表与上次轮询的列表对比,发现新内容就下载。具体来说:
- 新文件——上次列表里没有的文件
- 修改过的文件(可选)——大小或修改时间发生变化的文件
- 子文件夹——FTPull 支持递归监控子目录,不需要为每个子文件夹单独创建连接
文件类型过滤
只关心特定类型的文件——比如数据源的 .csv 或处理系统的 .pdf——设置扩展名过滤器,FTPull 会静默跳过其他所有文件。远程文件夹里混有你不需要的文件类型时特别有用。
多文件夹,多服务器
相比脚本方案,FTPull 的一个实际优势是多连接管理。需要同时监控 5 个不同的 FTP 服务器?在 FTPull 里添加 5 个连接,各自独立运行,统一由菜单栏的一个图标管理,每个连接有独立的轮询间隔和配置。
用 cron 实现同样的事情,意味着 5 个独立脚本、5 条 cron 记录、5 个没人看的日志文件。
定时计划
FTPull 内置计划功能,可以将监控限制在特定时间段和工作日。文件只在工作时间到达?没必要凌晨三点还在轮询。设置好时间范围(比如工作日 8:00–20:00),FTPull 在计划外自动暂停,减少不必要的网络请求和服务器负担。
出了问题怎么办
这是 FTPull 与脚本方案差异最明显的地方。下载失败时:
- 文件获得红色 Finder 标签——不用打开应用,直接在下载文件夹就能看到
- macOS 通知中心发送错误通知
- FTPull 日志视图记录具体失败原因
- 下次轮询自动重试
对比 cron 脚本:错误追加到没人看的日志里,其他什么都不发生,直到有人发现文件没到才知道出了问题。
脚本需要持续维护
Shell 脚本和 cron 任务没有界面、没有通知、没有错误恢复。凭据变了、服务器迁了、网络出问题——它们会静默失败,直到有人追问文件去哪了才能发现。
FTPull 把这一切都处理好了。配置一次,在后台持续运行,需要你注意的时候才会告诉你。