2017-05-08 2 views
3

Ein Cronjob wird alle 3 Stunden ausgeführt, um eine Datei mit SFTP herunterzuladen. Das geplante Programm ist in Perl geschrieben und das verwendete Modul ist Net::SFTP::Foreign.SFTP-Datei zum gleichen Zeitpunkt hochladen und herunterladen

Kann die Net::SFTP::Foreign Dateien herunterladen, die nur teilweise mit SFTP hochgeladen werden?

Wenn ja, müssen wir das Änderungsdatum der SFTP-Datei überprüfen, um den Abschluss des Kopiervorgangs zu überprüfen?

Angenommen, eine neue Datei wird von einer Person in SFTP hochgeladen, und die Datei wird hochgeladen/kopiert. Wenn ein Download zur gleichen Zeit versucht wird, muss ich für die Möglichkeit codieren, nur einen Teil einer Datei zu holen?

Antwort

2

Es ist keine Frage der SFTP Client Sie verwenden, das ist irrelevant. Es ist, wie der SFTP Server die Situation behandelt.

Einige SFTP-Server können die hochgeladene Datei sperren, so dass Sie nicht darauf zugreifen können, während sie noch hochgeladen wird. Die meisten SFTP-Server, insbesondere der allgemeine OpenSSH SFTP-Server, sperren die Datei jedoch nicht.

Es gibt keine generische Lösung für dieses Problem. Das Überprüfen auf Zeitstempel- oder Größenänderungen kann für Sie funktionieren, aber es ist kaum zuverlässig.

Es gibt einige allgemeine Abhilfen für das Problem:

  • Haben Sie den Uploader Upload "done" Datei beendet einmal hochladen. Lassen Sie Ihr Programm warten, bis die Datei "done" angezeigt wird.
  • Sie können dedizierten Ordner "upload" haben und den Uploader (atomar) die hochgeladene Datei in den Ordner "done" verschieben. Stellen Sie Ihr Programm nur auf den Ordner "done".
  • Haben Sie eine Dateibenennungskonvention für Dateien, die hochgeladen werden (".filepart") und der Uploader (atomar) die Datei nach dem Hochladen in den endgültigen Namen umbenennen soll. Lassen Sie Ihr Programm die Dateien ".filepart" ignorieren.
    Siehe (meinen) Artikel Locking files while uploading/Upload to temporary file name zum Beispiel für die Umsetzung dieses Ansatzes.
  • Ein grober Hack ist es, regelmäßig nach Dateiattributen (Größe und Zeit) zu überprüfen und den Upload als beendet zu betrachten, wenn sich die Attribute für einige Zeitintervalle nicht geändert haben.

Einzelheiten finden Sie in meiner Antwort auf SFTP file lock mechanism.

0

Sie können die Größe der Datei überprüfen.

  1. Verbinden mit SFTP.
  2. Überprüfen Sie die Dateigröße.
  3. Schlaf für 5/10 Sekunden.
  4. Überprüfen Sie die Dateigröße erneut.
  5. Wenn Größe nicht ändern, laden Sie die Datei, wenn die Größe tun 3. Schritt geändert
1

Der einfachste Weg, das zu tun, wenn der Upload-Prozess ist auch unter Kontrolle, ist Dateien mit zeitlicher Namen hochladen (zum Beispiel foo-20170809.tgz.temp) und sobald der Upload abgeschlossen ist, umbenennen Sie dann (Net::SFTP::Foreign::put Methode unterstützt die atomic Option, die genau das tut).Filtern Sie dann auf der Download-Seite die Dateien mit Namen, die temporalen Dateien entsprechen.

Wie auch immer, Net::SFTP::Foreignget und rget Methoden können angewiesen werden, eine Übertragung mit der Option resume => 1 fortzusetzen.

Wenn Sie vollen SSH-Zugriff auf den SFTP-Server haben, können Sie überprüfen, ob noch ein anderer Prozess in die Datei schreibt, die mit fuser oder einem ähnlichen Tool heruntergeladen werden soll (beachten Sie jedoch, dass die Datei selbst dann möglicherweise unvollständig sein, wenn zum Beispiel ein Netzwerkproblem vorliegt und der Uploader erneut verbunden werden muss, bevor die Übertragung fortgesetzt wird.

Verwandte Themen