Frage

Die Situation ist wie folgt:

Eine Reihe von Remote-Arbeitsplätzen sammelt Datenfeld und ftp die gesammelten Felddaten zu einem Server über ftp. Die Daten werden als CSV-Datei gesendet, das für jede Workstation in dem FTP-Server in einem eindeutigen Verzeichnis gespeichert wird.

Jede Workstation sendet ein neues Update alle 10 Minuten, die vorherigen Daten verursacht überschrieben werden. Wir möchten, dass irgendwie diese Daten automatisch verketten oder zu speichern. Die Verarbeitung der Workstation ist begrenzt und kann nicht verlängert werden, da es ein eingebettetes System ist.

Ein Vorschlag bot, war ein cronjob in dem FTP-Server zu laufen, aber es ist eine Nutzungsbedingung Beschränkung auf nur cronjobs in Intervallen von 30 Minuten zu ermöglichen, wie es-Shared Hosting ist. Angesichts der Zahl der Arbeitsplätze das Hochladen und die 10-Minuten-Intervall zwischen uploads es sieht aus wie die 30 Minuten Grenze der cronjob zwischen den Anrufen ein Problem sein könnte.

Gibt es einen anderen Ansatz, der vorgeschlagen werden könnte? Die verfügbaren serverseitige Skriptsprachen sind Perl, PHP und Python.

Ein Upgrade auf einen dedizierten Server erforderlich sein, aber ich würde immer noch Eingang zu bekommen, wie dieses Problem in der eleganteste Art und Weise zu lösen.

War es hilfreich?

Lösung

Die meisten modernen Linux unterstützt inotify Ihren Prozess zu informieren, wenn der Inhalt eines Diretory geändert hat, so dass Sie nicht einmal abfragen müssen.

Edit: Im Hinblick auf den Kommentar unten von Mark Baker:

„Seien Sie vorsichtig, wenn es, wie Sie so schnell benachrichtigt werden, wenn die Datei erstellt wurde, nicht, wenn es geschlossen ist. So haben Sie eine Möglichkeit, müssen sicherstellen, dass Sie nicht Teil-Dateien aufheben.“

Das wird mit der inotify Uhr passieren Sie auf der Verzeichnisebene festgelegt - die Art und Weise, um sicherzustellen, dass Sie dann eine weitere inotify Uhr auf die neue Datei nicht setzt die partielle Datei holen ist und suchen nach dem IN_CLOSE Ereignisse so dass Sie die Datei wurde vollständig geschrieben.

kennen

Sobald Ihr Prozess dies gesehen hat, können Sie die inotify Uhr auf diese neue Datei löschen und verarbeiten es in Ihrer Freizeit.

Andere Tipps

Sie können einen persistenten Daemon betrachten, die Abfrage der Zielverzeichnisse hält:

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

Dann können Sie Ihre Cron-Job nur versuchen, den Daemon alle 30 Minuten zu starten. Wenn der Daemon nicht die lockfile greifen kann, es stirbt nur, so gibt es keine Sorgen über mehrere Daemons ausgeführt wird.

Ein weiterer Ansatz zu betrachten wäre, die Dateien über HTTP POST zu unterwerfen und sie dann über eine CGI-Prozess. Auf diese Weise garantieren Sie, dass sie mit richtig zum Zeitpunkt der Einreichung behandelt worden sind.

Die 30 Minuten Einschränkung ist wirklich ziemlich dumm. Prozesse in Linux zu starten ist nicht eine teuere Operation, so dass, wenn alles, was Sie tun für neue Dateien ist die Überprüfung gibt es keinen guten Grund, es als die häufiger nicht zu tun. Wir haben Cron-Jobs, die jede Minute laufen und sie haben keinen nennenswerten Einfluss auf die Leistung. Aber ich weiß, es nicht die Regel ist, und wenn Sie mit dem Hosting-Anbieter bleiben Sie gehen nicht über eine Wahl.

Sie müssen einen langen laufenden Daemon irgendeine Art. Der einfache Weg ist, einfach regelmäßig abzufragen, und wahrscheinlich das ist, was ich tun würde. Inotify, so dass Sie so schnell benachrichtigt, als eine Datei erstellt wird, ist eine bessere Option.

Sie können inotify von Perl mit Linux verwenden :: Inotify oder aus Python mit pyinotify.

Seien Sie vorsichtig, wie Sie so schnell benachrichtigt werden, wenn die Datei erstellt wurde, nicht, wenn es geschlossen ist. So haben Sie eine Möglichkeit, müssen sicherstellen, dass Sie nicht Teil-Dateien aufheben.

Mit Polling ist es weniger wahrscheinlich, dass Sie Teil-Dateien sehen werden, aber es wird schließlich passieren und wird ein böse schwer zu reproduzieren Fehler sein, wenn es passiert, so besser mit dem Problem jetzt befassen.

Wenn Sie schauen mit Ihrem vorhandenen FTP-Server-Setup zu bleiben, dann würde ich so etwas wie inotify oder daemonisierte Prozess beraten über die Upload-Verzeichnisse zu beobachten. Wenn Sie mit Umzug in einen anderen FTP-Server OK sind, könnte nehmen Sie einen Blick auf pyftpdlib die ein Python FTP-Server lib ist.

Ich habe ein Teil des Entwickler-Teams schon eine Weile für pyftpdlib und eine häufigeren Anfrage war für eine Art und Weise zu „Prozess“ Dateien, sobald sie fertig Hochladen haben. Aufgrund der, dass wir eine on_file_received() Callback-Methode erstellt, die nach Abschluss einer Upload (siehe

scroll top