やりたいことはシンプルです:リモート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フォルダーの監視を始めるには:
- FTPullをインストールしてアプリケーションフォルダから起動します。メニューバーにアイコンが追加されます。
- 設定を開いて新しい接続を追加します:ホスト名、ポート、ユーザー名、パスワード、プロトコル(FTP/SFTP/FTPS)。
- リモートフォルダーのパスを設定します:監視したいサーバー上のディレクトリです。
- ローカルフォルダーを設定します:ダウンロードしたファイルをMacのどこに保存するかです。
- ポーリング間隔を設定します:FTPullがサーバーを確認する頻度。即時性が必要なら1分ごと、ネットワーク負荷を抑えたいなら5分ごとです。
- 接続を有効にします。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はそのすべてを処理します。一度設定すれば、バックグラウンドで静かに動き続けます:注意が必要なときだけ、きちんと知らせてくれます。
