Frage

Ich habe eine Anwendung, die Abfrage kontinuierlich auf einem Ordner ist. Sobald eine Datei in den Ordner, FTP ist, muss die Anwendung für die Verarbeitung dieser Datei in einen anderen Ordner verschieben.

Hier haben wir keine Möglichkeit haben, zu überprüfen, ob ftp abgeschlossen ist oder nicht.

Ein Befehl „lsof“ in den technischen Foren vorgeschlagen. Es wurde eine Spalte Dateibeschreibung, die den Dateistatus gibt.

Da dies ein kostenloser bsd Befehl ist und nicht in alten Versionen von Linux, mag ich die Verwendung dieses Befehls klären.

Könnt ihr sagen Sie uns Ihre Erfahrung in Dateiüberprüfung und gibt es eine andere alternative Lösung zur Verfügung?

Auch ist es ein Risiko dieses Dienstprogramm in Verwendung?

Schätzen Sie Ihre Hilfe im Voraus.

Danke, Mathew Liju

War es hilfreich?

Lösung

Wir haben dies vor in einer Reihe von verschiedenen Arten erfolgen.

Methode eins:

Wenn Sie den Prozess sendet die Dateien steuern können, haben sie die Datei selbst durch eine Sentinel-Datei gefolgt senden. Zum Beispiel folgte die eigentliche Datei "contracts.doc" senden durch einen Ein-Byte-"contracts.doc.sentinel".

Dann haben Ihren Listener-Prozess für die Sentinel-Dateien achten. Als einer von ihnen erstellt wird, sollten Sie die entsprechende Datendatei verarbeiten, dann beide löschen.

Jede Datendatei, die mehr als einen Tag alt ist und nicht über eine entsprechende Sentinel-Datei, es loszuwerden -. Es war eine fehlgeschlagene Übertragung

Methode zwei:

Halten Sie ein Auge auf die Dateien selbst (speziell das letzte Änderungsdatum / Zeit). Nur Dateien Prozess, deren Änderungszeit ist mehr als N Minuten in der Vergangenheit. Das erhöht die Latenzzeit, die Dateien zu verarbeiten, aber sie können in der Regel sicher sein, dass, wenn eine Datei nicht (zum Beispiel) in fünf Minuten geschrieben wurde, es gemacht wird.

Fazit:

Diese beiden Methoden wurden von uns in der Vergangenheit erfolgreich eingesetzt. Ich ziehe es die erste, aber wir hatten einmal die zweite zu verwenden, wenn wir den Prozess nicht erlaubt war, zu ändern, um die Dateien zu senden.

Der Vorteil des ersten ist, dass Sie weiß die Datei ist fertig, wenn die Sentinel-Datei angezeigt wird. Mit beiden lsof (ich nehme an, Sie Dateien sind die Behandlung, die von jedem Prozess als bereit für die Verarbeitung nicht geöffnet sind) und die Zeitstempel, es möglich ist, dass der FTP in der Mitte abgestürzt und Sie können eine halbe Datei werden verarbeitet.

Andere Tipps

Es gibt normalerweise drei Ansätze für diese Art von Problem.

  1. eine Signaldatei bereitstellt, so dass, wenn Sie Ihre Datei übertragen wird, wird eine zusätzliche Datei, die Übertragung markieren gesendet abgeschlossen
  2. fügen Sie einen Eintrag in eine Protokolldatei in diesem Verzeichnis eine Übertragung anzuzeigen abgeschlossen ist (dies wirklich funktioniert nur, wenn Sie einen einzelnen Peer, um das Verzeichnis zu aktualisieren, zu vermeiden Parallelitätsprobleme)
  3. Parsen der Datei Vollständigkeit zu bestimmen. z.B. wird die Datei mit einem Längenfeld zu starten, oder ist es offensichtlich unvollständig? z.B. eine unvollständige XML-Datei Parsen wird in einem Parse-Fehler führen aufgrund des Fehlens eines Endglied. Je nach Größe Ihrer Datei und das Format, kann dies trivial, oder kann sehr zeitaufwendig sein.

lsof wäre möglicherweise eine Option sein, obwohl Sie Ihre Linux-Portabilität Problem identifiziert haben. Wenn Sie diese verwenden, beachten Sie die Option -F, der den Ausgang geeignet für die Verarbeitung von anderen Programmen formatiert, anstatt in lesbarer Form.

EDIT: (!). Pax identifizierte eine vierte Methode, die ich vergessen hatte - mit der Tatsache, dass der Zeitstempel der Datei in einiger Zeit nicht aktualisiert

Es ist ein fünftes Verfahren. Sie können auch überprüfen, ob die FTP-Sitzung noch aktiv ist. Das funktioniert, wenn jeder Peer ein eigenes FTP-Benutzerkonto hat. Solange der Benutzer nicht von FTP abgemeldet wird, nehmen die Dateien sind nicht vollständig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top