2009-04-30 8 views
12

Jemand sendet FTP eine Datei der Größe 10MB in den Ordner auf einem Linux-Server. Während die Datei im Übergang ist, wacht ein Cron auf und feuert ein Perl-Skript ab, das entworfen wurde, um den ftp-Ordner anzusehen und alles, was dort gefunden wird, in einen anderen Ordner zu verschieben. Ich verwende die move() Funktion von File::Copy. Der Perl-Prozess benennt die Dateien tatsächlich als Teil seiner Aufgabe um. Ist das wichtig, oder ist es dem FTP egal, wie das Dateisystem die Datei beschreibt?Was passiert, wenn Perl versucht, move() für eine Datei aufzurufen, die gerade hochgeladen wird?

Wird move() erfolgreich und eine Teildatei verschieben, so dass die FTP was tun? Oder wird verschieben fehlschlagen und 0 zurückgeben?

+0

danke für die Abstimmung meine Frage! :) –

+3

eine der größten Funktionen von Linux im Gegensatz zu Windows IMHO ist, dass Sie Dinge tun können, um Dateien wie Verschieben, Umbenennen und sogar Löschen zu öffnen, und die Apps, die sie geöffnet haben, werden vergessen. Sie können sogar Programme löschen, während sie laufen, und sie werden weiterhin gut laufen (aber sobald sie beendet sind, können Sie sie nie wieder zurückholen ...) – rmeador

+0

Was ist move() und wohin bewegt es sich? Ist es möglich, Dateien zu kopieren, statt sie nur umzubenennen –

Antwort

10

Nein, move sollte nur den Download-Prozess an der neuen Position abschließen. Sie bewegen nur den Inode von einer Position zur anderen. Der geöffnete Dateideskriptor aus dem Download-Programm sollte immer noch darauf zeigen.

Ich möchte nur wiederholen, was ein paar andere erwähnt. Dies funktioniert nur, solange sich die Verschiebeoperation im selben Dateisystem befindet. Wenn es als ein anderes Dateisystem als der Inode kann nicht übertragen werden, da es immer zum selben Dateisystem gehört. Das wahrscheinlichste Szenario wäre dann, dass die Teildaten in diesem Moment an den neuen Ort kopiert werden, während das Programm immer noch in den alten Inode herunterlädt, der nicht mehr an eine Datei angehängt ist und daher nicht verwendet werden kann.

+1

Umbenennung dieser ist nicht wichtig, weil es den Inode nicht ändert. Im Dateisystem ist der Name mit Inodes verknüpft. Verschieben und Umbenennen sind in Bezug auf Ihre Frage nahezu identisch. Eine neue Datei mit dem alten Dateinamen enthält nur einen anderen Inode und ist nicht problematisch. Nur für den Fall, dass dies Ihre nächste Frage wäre :) –

+2

Vorbehalt: Wenn Sie zwischen Dateisystemen wechseln, wird der Upload beendet, aber Sie können nicht zur Datei gelangen, da kein Verweis auf den Inode existiert. Sie werden mit einer partiellen Datei auf dem anderen Dateisystem enden. –

1

Ich bin mir nicht sicher, aber wahrscheinlich wird nichts passieren. Durch Verschieben wird die Inode-Nummer der Datei nicht geändert, sodass der FTP-Server die Verschiebung überhaupt nicht bemerkt und weiterhin in die Datei am neuen Speicherort schreibt. Kurz gesagt, die move() ist erfolgreich und der Upload wird am neuen Speicherort fortgesetzt.

5

Da es keinen Standard move gibt, ist es schwer zu wissen, was in Ihrem Szenario vor sich geht. Wenn Sie rename meinten, dann werden Sie wahrscheinlich keine Probleme haben, da die Hauptursache Ihrer Situation schief gehen würde, wenn Sie die Datei von einem Dateisystem in ein anderes verschieben würden (und deshalb ein Kopieren und Löschen, nicht ein echte Bewegung), und auf den meisten Systemen wird rename unter diesen Umständen fehlschlagen. (Also, wenn Ihr Setup überhaupt funktioniert, wird es in Ordnung sein.)

Wenn Sie nicht rename verwenden, aber einige move Funktion, die zum Beispiel behandelt über Dateisysteme zu bewegen, dann könnte man sehr gut aufzuwickeln mit eine Teildatei, wenn mehrere Dateisysteme beteiligt sind. (Dies kann zu einem sehr unangenehmen Fall werden, wenn Sie zum Beispiel alle auf einem Dateisystem sind, aber diese hochgeladenen Dateien benötigen später viel Platz und Sie fügen ein Laufwerk hinzu, das sie speichert. und jetzt machst du einen Cross-Dateisystem-Umzug.)

+0

Ich benutze die Perl-Move-Funktion, die ich denke, ist nur ein Wrapper um> mv -src-dest Speziell der Code ist move ("$ ftpDir $ inFile", "$ someOtherDir $ newFileName"); –

+2

Wenn es ein Wrapper um das System/bin/mv ist, dann sind Sie absolut in Gefahr von Teildateien, * wenn und nur wenn * Sie sich über Dateisysteme bewegen (jetzt oder in Zukunft). – chaos

+0

Aber solange das Dateisystem das gleiche ist, stimmen Sie zu, dass es keinen Schaden gibt? –