やりたいことはシンプルです:リモート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分ごとにサーバーを確認して新しいファイルをダウンロードします。

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

  • 通知がない。ファイルがフォルダーに届いても、手動で確認するまで気づけません。
  • エラーが出ても気づかない。パスワードが変わったり、サーバーが移転したり、ネットワークに問題が起きたりすると、スクリプトは静かに失敗します。誰かに「ファイルが届いていない」と言われて初めて気づくことになります。
  • UIがない。デバッグにはログファイルを読む必要があります。状態確認にはコマンドを実行する必要があります。
  • メンテナンスが必要。macOSのアップデートでcronやlaunchdの設定が壊れることがあります。認証情報をプレーンテキストのスクリプトで管理しなければなりません。
  • エラー処理がない。ダウンロードの失敗やタイムアウトはログにエラーとして記録されるだけ:誰かが読んでいれば、の話です。

ターミナルに慣れた開発者で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はリモートフォルダーの状態を、現在のファイルリストと前回のポーリング時のリストを比較することで追跡します。新しいものはすべてダウンロードされます:

  • 新しいファイル:前回のリストになかったファイル
  • 変更されたファイル(オプション):サイズまたは更新日時が変わったファイル
  • サブフォルダー:FTPullはサブディレクトリを再帰的に監視できるため、サブフォルダーごとに別の接続を設定する必要はありません

拡張子フィルター

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

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

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

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

スケジュール機能

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

何か問題が起きたとき

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

  • ファイルに赤いFinderタグが付きます:アプリを開かなくてもダウンロードフォルダーを見れば即座に分かります
  • macOS通知センターからエラー通知が届きます
  • FTPullのログビューに具体的な失敗理由が記録されます
  • 次のポーリングサイクルで再試行されます

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

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

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

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