Que se passera-t-il si Perl essaie d'appeler move () sur un fichier en cours de téléchargement?

StackOverflow https://stackoverflow.com/questions/808419

  •  03-07-2019
  •  | 
  •  

Question

Quelqu'un envoie par FTP un fichier de 10 Mo dans un dossier situé sur un serveur Linux. Pendant que le fichier est en transition, un cron se réveille et déclenche un script Perl conçu pour examiner le dossier ftp et déplacer tout ce qu'il trouve dans un autre dossier. J'utilise la fonction move () de File :: Copy . Le processus Perl renomme réellement les fichiers dans le cadre de sa tâche. Est-ce important ou le FTP ne se soucie pas de ce que le système de fichiers décrit comme fichier?

move () réussira-t-il et déplacera-t-il un fichier partiel en laissant le FTP faire quoi? Ou va-t-il échouer et renvoyer 0?

Était-ce utile?

La solution

Non, le déménagement devrait simplement laisser terminer le processus de téléchargement du nouveau poste. Vous déplacez simplement l'inode d'une position à une autre. Le descripteur de fichier ouvert du programme de téléchargement doit toujours y pointer.

Je veux juste répéter ce que quelques autres ont mentionné. Cela ne fonctionne que tant que l'opération de déplacement est sur le même système de fichiers. S'il s'agit d'un autre système de fichiers, l'inode ne peut pas être transféré car il appartient toujours au même système de fichiers. Le scénario le plus probable serait alors que les données partielles à ce moment-là soient copiées vers le nouvel emplacement pendant que le programme se télécharge toujours dans l'ancien inode qui n'est plus attaché à un fichier et ne peut donc pas être utilisé.

Autres conseils

Comme il n'y a pas de move standard, il est difficile de savoir ce qui se passe dans votre scénario. Si vous vouliez dire rename , vous n’auriez probablement aucun problème, car le principal problème qui se poserait à votre situation serait que vous déplaciez le fichier d’un système de fichiers à un autre -and-delete, ce n'est pas un véritable mouvement) et sur la plupart des systèmes, renommer échouera dans ces circonstances. (Donc, si votre configuration fonctionne, ça ira.)

Si vous n'utilisez pas renommer mais une fonction move qui, par exemple, gérera le déplacement entre les systèmes de fichiers, vous pourriez très bien vous retrouver avec un fichier partiel. si plusieurs systèmes de fichiers sont impliqués. (Cela peut finir par devenir un très mauvais piège si, par exemple, vous êtes tous sur un système de fichiers maintenant, mais plus tard, ces fichiers que vous téléchargez prennent beaucoup de place et vous ajoutez un lecteur dédié à leur stockage - et maintenant vous faites un mouvement de système de fichiers croisé.)

Je ne suis pas sûr, mais très probablement rien ne va se passer. Le déplacement ne modifie pas le numéro d'inode du fichier, de sorte que le serveur FTP ne remarquera pas le déplacement du tout et continuera à écrire dans le fichier au nouvel emplacement. En résumé, move () réussira et le téléchargement se poursuivra au nouvel emplacement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top