ホストされたサーバーの一連のディレクトリにftpされたテキストファイルを処理する

StackOverflow https://stackoverflow.com/questions/208772

質問

状況は次のとおりです。

一連のリモートワークステーションがフィールドデータを収集し、収集したフィールドデータをFTP経由でサーバーにftpします。データはCSVファイルとして送信され、FTPサーバーの各ワークステーションの一意のディレクトリに保存されます。

各ワークステーションは10分ごとに新しい更新を送信し、以前のデータを上書きします。このデータを何らかの方法で自動的に連結または保存したいと思います。ワークステーションの処理は制限されており、組み込みシステムであるため拡張できません。

提案された提案の1つはFTPサーバーでcronjobを実行することでしたが、共有ホスティングであるため、30分間隔でのみcronjobを許可するという利用規約の制限があります。アップロードするワークステーションの数とアップロード間の10分の間隔を考えると、cronjobの呼び出し間の30分の制限が問題になる可能性があります。

提案される可能性のある他のアプローチはありますか?利用可能なサーバー側スクリプト言語は、perl、php、pythonです。

専用サーバーへのアップグレードが必要になる場合がありますが、この問題を最も洗練された方法で解決する方法についての情報を引き続き入手したいと思います。

役に立ちましたか?

解決

ほとんどの最新のLinuxはinotifyをサポートし、ディレクトリの内容が変更されたときにプロセスに通知するため、ポーリングする必要さえありません。

編集:マークベイカーからの以下のコメントに関して:

"ただし、ファイルが閉じられたときではなく、ファイルが作成されるとすぐに通知されるので注意してください。そのため、部分的なファイルをピックアップしないようにするための何らかの方法が必要になります。"

それは、ディレクトリレベルで設定したinotifyウォッチで発生します-部分的なファイルを取得しないようにする方法は、新しいファイルでさらにinotifyウォッチを設定し、IN_CLOSEイベントを探すことですファイルが完全に書き込まれたことを知っていること。

プロセスでこれを確認したら、この新しいファイルのinotifyウォッチを削除して、自由に処理できます。

他のヒント

ターゲットディレクトリをポーリングし続ける永続的なデーモンを検討する場合があります。

grab_lockfile() or exit();
while (1) {
    if (new_files()) {
        process_new_files();
    }
    sleep(60);
}

その後、cronジョブは30分ごとにデーモンを開始しようとすることができます。デーモンがロックファイルを取得できない場合、デーモンはただ死ぬため、複数のデーモンが実行されている心配はありません。

検討するもう1つの方法は、HTTP POSTを介してファイルを送信し、CGIを介してそれらを処理することです。これにより、提出時に適切に処理されたことを保証します。

30分の制限は本当にばかげています。 Linuxでプロセスを開始するのは高価な操作ではないため、新しいファイルをチェックするだけであれば、それ以上頻繁に実行しない理由はありません。毎分実行されるcronジョブがあり、パフォーマンスに顕著な影響はありません。ただし、それはあなたのルールではなく、そのホスティングプロバイダーに固執する場合は選択肢がないことに気づきます。

長時間実行される何らかのデーモンが必要になります。簡単な方法は、定期的にポーリングすることです。おそらくそれが私がしたいことです。 Inotifyは、ファイルが作成されるとすぐに通知されるため、より良いオプションです。

Linux :: Inotifyでperlから、またはpyinotifyでpythonからinotifyを使用できます。

ただし、ファイルが閉じられたときではなく、ファイルが作成されるとすぐに通知されるので注意してください。そのため、部分的なファイルをピックアップしないようにするための何らかの方法が必要になります。

ポーリングでは、部分的なファイルが表示される可能性は低くなりますが、最終的には発生し、発生すると再現が難しい厄介なバグになるため、今すぐ問題に対処することをお勧めします。

既存のFTPサーバーの設定を維持したい場合は、inotifyまたはデーモン化されたプロセスなどを使用して、アップロードディレクトリを監視することをお勧めします。別のFTPサーバーに移動しても問題ない場合は、 pyftpdlibをご覧ください。 はPython FTPサーバーライブラリです。

私はしばらくの間pyftpdlibの開発チームの一員でしたが、より一般的なリクエストの1つは、「処理」する方法に対するものでした。アップロードが完了したら、ファイル。そのため、アップロードの完了時にトリガーされる on_file_received()コールバックメソッドを作成しました(問題#79 で問題を追跡してください)。

Pythonに慣れている場合は、FTPサーバーとしてpyftpdlibを実行し、コールバックメソッドから処理コードを実行するとうまくいくかもしれません。 pyftpdlibは非同期であり、マルチスレッドではないため、コールバックメソッドがブロックできないことに注意してください。長時間実行されるタスクを実行する必要がある場合は、実際の処理作業に別のPythonプロセスまたはスレッドを使用することをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top