0

状況は次のとおりです。

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

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

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

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

専用サーバーへのアップグレードが必要な場合もありますが、それでもこの問題を最も洗練された方法で解決する方法について意見を求めたいと思います。

4

4 に答える 4

4

ターゲットディレクトリをポーリングし続ける永続的なデーモンを検討するかもしれません:

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

その後、cron ジョブは 30 分ごとにデーモンの起動を試みることができます。デーモンがロックファイルを取得できない場合、デーモンは停止するだけなので、複数のデーモンが実行される心配はありません。

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

于 2008-10-16T14:31:05.867 に答える
4

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

編集:Mark Ba​​ker からの以下のコメントに関して:

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

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

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

于 2008-10-16T15:17:33.497 に答える
1

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

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

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

于 2009-04-03T01:01:51.113 に答える
1

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

ある種の長期実行デーモンが必要になります。簡単な方法は、定期的にポーリングすることであり、おそらくそれが私のやり方です。ファイルが作成されるとすぐに通知されるように、inotify を使用することをお勧めします。

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

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

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

于 2008-10-16T16:56:45.167 に答える