2008-09-07 10 views
168

Ich habe zwei Maschinen, Geschwindigkeit und Masse. Geschwindigkeit 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. Idealerweise würde ich gerade laufen:halten Rsync von Entfernen unfertiger Quelldateien

aber ich sorge mich, dass rsync eine Quelldatei auflöst, die noch nicht fertig geladen worden ist. (Ich habe mir den Quellcode angeschaut und ich habe nichts gesehen, was davor schützt.) Irgendwelche Vorschläge?

Antwort

8

Wie viel Kontrolle haben Sie über den Download-Prozess? Wenn Sie eine eigene Rolle erstellen, können Sie die heruntergeladene Datei in ein temporäres Verzeichnis verschieben oder einen temporären Namen haben, bis der Download abgeschlossen ist, und dann den richtigen Namen an den Dateinamen übergeben. Wenn Sie Software von Drittanbietern verwenden, haben Sie nicht so viel Kontrolle, aber Sie können möglicherweise noch die Temp-Verzeichnis-Sache tun.

10

Es scheint mir das Problem ist Übertragung eine Datei, bevor es abgeschlossen ist, nicht, dass Sie es löschen.

Wenn dies Linux ist, ist es möglich, dass eine Datei von Prozess A geöffnet wird und Prozess B die Verknüpfung der Datei aufheben kann. 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 rsync löscht die Quelldatei nur, nachdem es kopiert wurde, und wenn es noch auf die Festplatte geschrieben wird, haben Sie eine partielle Datei.

Wie wäre es damit: Mount mass als Remote-Dateisystem (NFS würde funktionieren) in speed. Dann web-crawlen Sie die Dateien direkt.

3

Rsync kann Dateien ausschließen, die bestimmten Mustern entsprechen. Auch wenn Sie es nicht so ändern können, dass es Dateien in ein temporäres Verzeichnis herunterlädt, hat es vielleicht eine Konvention, die Dateien während des Downloads anders zu benennen (zum Beispiel foo.downloading beim Herunterladen für eine Datei mit dem Namen foo) und Sie können diese Eigenschaft verwenden Schließen Sie Dateien, die noch heruntergeladen werden, nicht aus.

3

Wenn Sie die Kontrolle über den Crawling-Prozess haben oder eine vorhersagbare Ausgabe haben, die obigen Lösungen (Speichern in einer temporären Datei bis zum Ende, dann mv'ing zum abgeschlossenen Download-Bereich oder Ignorieren von Dateien mit einem '.downloads' Art des Namens) könnte funktionieren. Wenn all das 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 sicher, sie zu verschieben.