やりたいことはシンプルです:リモートFTPサーバーに新しいファイルが届いたら知りたい、そして何かアクションを取りたい。ダウンロードする、処理する、別のワークフローを起動するなど。問題は、FTPサーバーは通知を送ってこない点です。ただそこにあるだけ。こちらから確認しに行く必要があります。

解決策は2つあります。1つ目はターミナルとシェルスクリプトの知識が必要で、エラーが起きても気づきにくい方法。2つ目はそのどちらも不要な方法です。

難しい方法:シェルスクリプトとcron

システム管理者にFTPフォルダーの監視方法を聞くと、たいてい lftp:コマンドラインのFTPクライアント:とcronジョブまたはlaunchdエージェントを組み合わせる方法が返ってきます。

典型的なセットアップはこうです。まず lftp でリモートフォルダーをローカルにミラーするシェルスクリプトを書きます:

#!/bin/bash
# ftp-ダウンロード.sh
lftp -u ユーザー名,パスワード ftp.example.com << EOF
mirror --only-newer --no-recursion /remote/folder /Users/you/Downloads/ftp-watch/
quit
EOF

次に、5分ごとに実行するcronエントリを設定します(crontab -e):

# FTP同期を5分ごとに実行
*/5 * * * * /Users/you/scripts/ftp-ダウンロード.sh >> /tmp/ftp-sync.log 2>&1

これで動きます。正しく設定されていて、その設定が維持される限り、5分ごとにサーバーを確認して新しいファイルをダウンロードします。

しかし、この方法には実際の問題があります:

ターミナルに慣れた開発者でGUIより コードを好む人には許容範囲かもしれません。それ以外の人や、信頼性とフィードバックが重要なワークフローには向きません。

簡単な方法:FTPull

FTPullは、リモートFTPフォルダーを監視して新しいファイルを自動でダウンロードするmacOSアプリです。根本的な仕組み:定期的なサーバーポーリング:は同じですが、シェルスクリプトアプローチの問題点がすべて解決されています。

FTPフォルダーの監視を始めるには:

  1. FTPullをインストールしてアプリケーションフォルダから起動します。メニューバーにアイコンが追加されます。
  2. 設定を開いて新しい接続を追加します:ホスト名、ポート、ユーザー名、パスワード、プロトコル(FTP/SFTP/FTPS)。
  3. リモートフォルダーのパスを設定します:監視したいサーバー上のディレクトリです。
  4. ローカルフォルダーを設定します:ダウンロードしたファイルをMacのどこに保存するかです。
  5. ポーリング間隔を設定します:FTPullがサーバーを確認する頻度。即時性が必要なら1分ごと、ネットワーク負荷を抑えたいなら5分ごとです。
  6. 接続を有効にします。FTPullはすぐにポーリングを開始します。

設定はこれだけです。以降、FTPullがすべてを自動で処理します。サーバーに新しいファイルが届くと、次のポーリングで検出してダウンロードし、macOSの通知を送ります。

FTPullが監視するもの

FTPullはリモートフォルダーの状態を、現在のファイルリストと前回のポーリング時のリストを比較することで追跡します。新しいものはすべてダウンロードされます:

拡張子フィルター

特定のファイルタイプだけが必要な場合:例えばデータフィードの .csv ファイルや処理システムの .pdf ファイル:拡張子フィルターを設定します。FTPullはそれ以外のファイルを静かにスキップします。リモートフォルダーに不要なファイルタイプが混在している場合に便利です。

複数フォルダー、複数サーバー

シェルスクリプトに比べた実際のメリットの一つが、複数接続の管理です。5つの異なるFTPサーバーを監視する必要がありますか?FTPullに5つの接続を追加するだけです。それぞれが独立して動作し、1つのメニューバーアイコンから管理できます。各接続に独自のポーリング間隔と設定を持てます。

cronで同じことをしようとすると、それぞれ別のスクリプト、別のcronエントリ、誰も読まない別のログファイルが必要になります。

スケジュール機能

FTPullには、特定の時間帯・曜日に監視を制限するスケジュール機能があります。ファイルが営業時間内にしか届かないなら、土曜の深夜3時にポーリングする必要はありません。スケジュールを設定すると(例:平日8時〜20時)、FTPullはその時間外は自動的に一時停止します。

何か問題が起きたとき

ここがFTPullとスクリプトアプローチの最も大きな違いです。ダウンロードに失敗した場合:

cronスクリプトとの比較:エラーが誰も読んでいないログファイルに追記されるだけ、それ以外は何も起きず、誰かが気づくまでファイルはダウンロードされません。

スクリプトは継続的なメンテナンスが必要

シェルスクリプトとcronジョブにはUIも通知もエラー回復もありません。認証情報の変更、サーバーの移転、ネットワーク問題があると、気づかないまま失敗し続けます。誰かに「なんでファイルが届かないの?」と聞かれて初めて判明します。

FTPullはそのすべてを処理します。一度設定すれば、バックグラウンドで静かに動き続けます:注意が必要なときだけ、きちんと知らせてくれます。