Verhindern Sie, dass rsync unfertige Quelldateien entfernt

169

Ich habe zwei Maschinen, Geschwindigkeit und Masse. speed hat eine schnelle Internetverbindung und führt einen Crawler aus, der viele Dateien auf die Festplatte herunterlädt. Masse hat viel Speicherplatz. Ich möchte die Dateien nach dem Herunterladen von Geschwindigkeit auf Masse verschieben. Im Idealfall würde ich einfach laufen:

$ rsync --remove-source-files speed:/var/crawldir .

Ich mache mir jedoch Sorgen, dass rsync die Verknüpfung einer Quelldatei aufhebt, die noch nicht vollständig heruntergeladen wurde. (Ich habe mir den Quellcode angesehen und keinen Schutz dagegen gesehen.) Irgendwelche Vorschläge?

aaronsw
quelle

Antworten:

10

Mir scheint, das Problem besteht darin , eine Datei zu übertragen, bevor sie vollständig ist, und nicht, dass Sie sie löschen.

Wenn dies Linux ist, kann eine Datei von Prozess A geöffnet werden, und Prozess B kann die Verknüpfung der Datei aufheben. Es gibt keinen Fehler, aber natürlich verschwendet A seine Zeit. Daher ist die Tatsache, dass rsync die Quelldatei löscht, kein Problem.

Das Problem ist, dass rsync die Quelldatei erst nach dem Kopieren löscht. Wenn sie noch auf die Festplatte geschrieben wird, haben Sie eine Teildatei.

Wie wäre es damit: Mounten Sie massals Remote-Dateisystem (NFS würde funktionieren) in speed. Dann crawlen Sie die Dateien einfach direkt per Web.

Jason Cohen
quelle
9

Wie viel Kontrolle haben Sie über den Download-Prozess? Wenn Sie Ihre eigene rollen, können Sie die heruntergeladene Datei in ein temporäres Verzeichnis verschieben oder einen temporären Namen haben, bis der Download abgeschlossen ist, und sie dann nach Abschluss des Vorgangs auf den richtigen Namen verschieben. Wenn Sie Software von Drittanbietern verwenden, haben Sie nicht so viel Kontrolle, können aber möglicherweise das temporäre Verzeichnis ausführen.

Paul Tomblin
quelle
3

Rsync kann Dateien ausschließen, die bestimmten Mustern entsprechen. Selbst wenn Sie es nicht ändern können, um Dateien in ein temporäres Verzeichnis herunterzuladen, hat es möglicherweise die Konvention, die Dateien während des Downloads anders zu benennen (z. B. foo.downloadingbeim Herunterladen für eine Datei mit dem Namen foo), und Sie können diese Eigenschaft verwenden, um Dateien auszuschließen die noch vom Kopieren heruntergeladen werden.

Grauer Panther
quelle
3

Wenn Sie die Kontrolle über den Crawling-Prozess haben oder eine vorhersehbare Ausgabe haben, werden die oben genannten Lösungen (Speichern in einem Tempfile bis zum Abschluss, dann zum Speicherort für abgeschlossene Downloads oder Ignorieren von Dateien mit dem Namen ".downloading") könnte funktionieren. Wenn all dies außerhalb Ihrer Kontrolle liegt, können Sie sicherstellen, dass die Datei von keinem Prozess geöffnet wird, indem Sie 'lsof $ filename' ausführen und prüfen, ob ein Ergebnis vorliegt. Wenn niemand die Datei geöffnet hat, ist es natürlich sicher, sie zu verschieben.

pjz
quelle