2009-04-30 7 views
12

Qualcuno sta eseguendo il FTP di un file di dimensione 10Mb in una cartella su un server Linux. Mentre il file è in transizione, un cron si riattiva e avvia uno script Perl progettato per guardare la cartella ftp e spostare qualsiasi cosa trovasse lì in una cartella alternativa. Sto utilizzando la funzione move() da File::Copy. Il processo Perl in realtà rinomina i file come parte del suo compito. È importante o l'FTP non si cura di come il file system descrive il file?Cosa succederà se Perl tenta di chiamare move() su un file che viene caricato?

move() riuscirà e spostare un file parziale, lasciando l'FTP a fare cosa? Oppure si muoverà fallito e restituirà 0?

+0

grazie per aver votato la mia domanda! :) –

+3

una delle più grandi funzionalità di Linux rispetto a Windows IMHO è che puoi fare cose per aprire file come lo spostamento, la ridenominazione e persino l'eliminazione e le app che li hanno aperti saranno ignari. Puoi anche eliminare i programmi mentre sono in esecuzione e continueranno a funzionare correttamente (ma una volta usciti, non potrai mai riaverli ...) – rmeador

+0

Che cos'è move() e dove si stanno spostando le cose? È possibile copiare i file invece di ridenominarli semplicemente –

risposta

10

No, lo spostamento dovrebbe solo consentire di completare il processo di download nella nuova posizione. Stai semplicemente spostando l'inode da una posizione all'altra. Il descrittore di file aperto dal programma di download dovrebbe comunque puntare ad esso.

Voglio solo ripetere quello che alcuni altri hanno menzionato. Funziona solo finché l'operazione di spostamento si trova sullo stesso file system. Se come un altro file system l'inode non può essere trasferito perché appartiene sempre allo stesso file system. Lo scenario più probabile sarebbe che i dati parziali in quel momento vengano copiati nella nuova posizione mentre il programma continua a scaricarsi nel vecchio inode che non è più collegato a un file e quindi non può essere utilizzato.

+1

Rinominare quelli non importa perché non cambia l'inode. Nel filesystem il nome è associato agli inode. Lo spostamento e la ridenominazione sono quasi gli stessi per quanto riguarda la tua domanda. Un nuovo file con il vecchio nome del file conterrà solo un altro inode e non è problematico. Nel caso in cui questa fosse la tua prossima domanda :) –

+2

Attenzione: se ti sposti su file system, il caricamento terminerà, ma non sarai in grado di accedere al file perché non esiste alcun riferimento all'inode. Finirai con un file parziale sull'altro file system. –

1

Non sono sicuro, ma molto probabilmente non accadrà nulla di sbagliato. Lo spostamento non cambia il numero di inode del file, in modo che il server FTP non noti la mossa e continui a scrivere nel file nella nuova posizione. Per dirla in breve, il move() avrà successo e il caricamento continuerà nella nuova posizione.

5

Poiché non esiste uno standard move, è difficile sapere cosa sta succedendo nel proprio scenario. Se intendevi lo rename, probabilmente non avrai alcun problema, dal momento che il modo principale in cui la tua situazione andrebbe male è se stavi spostando il file da un file system a un altro (e quindi facendo un copia-e-cancella, non un vera mossa), e sulla maggior parte dei sistemi, l'errore rename fallirà in tali circostanze. (Quindi, se la configurazione funziona affatto, sarà bene.)

Se non si utilizza rename ma alcuni move funzione che, ad esempio, consente di gestire muoversi attraverso filesystem, allora si potrebbe benissimo finire con un file parziale se sono coinvolti più filesystem. (Questo può finire per essere un brutto scherzo se, ad esempio, ora sei su un unico filesystem, ma più tardi questi file che stai caricando occupano molto spazio e aggiungi un disco dedicato alla memorizzazione di questi - e ora stai facendo una mossa cross-filesystem.)

+0

Sto usando la funzione perl move che penso sia solo un wrapper in giro> mv -src -dest In particolare il codice è spostato ("$ ftpDir $ inFile", "$ someOtherDir $ newFileName"); –

+2

Se si tratta di un wrapper attorno al sistema/bin/mv, allora si è assolutamente a rischio di file parziali, * se e solo se * si sposta su file system (ora o in futuro). – chaos

+0

Ma finché il file system è lo stesso, accetti che non ci siano danni? –