171 votes

Garder rsync de supprimer des fichiers sources inachevés

J'ai deux machines, speed et mass. speed a une connexion Internet rapide et exécute un crawler qui télécharge beaucoup de fichiers sur le disque. mass a beaucoup d'espace disque. Je veux déplacer les fichiers de speed à mass après leur téléchargement. Idéalement, je lancerais simplement :

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

mais je crains que rsync ne supprime un fichier source qui n'a pas encore fini de se télécharger. (J'ai regardé le code source et je n'ai rien vu protégeant contre cela.) Des suggestions ?

10voto

Jason Cohen Points 36475

Il me semble que le problème est transférer un fichier avant qu'il ne soit complet, pas que vous le supprimez.

Si c'est Linux, il est possible qu'un fichier soit ouvert par le processus A et que le processus B puisse supprimer le fichier. Il n'y a pas d'erreur, mais bien sûr, A perd son temps. Par conséquent, le fait que rsync supprime le fichier source n'est pas un problème.

Le problème est que rsync supprime le fichier source uniquement après l'avoir copié, et s'il est toujours en cours d'écriture sur le disque, vous aurez un fichier partiel.

Et si vous montez mass comme un système de fichiers distant (NFS fonctionnerait) dans speed. Ensuite, il vous suffit de parcourir les fichiers directement.

9voto

Paul Tomblin Points 83687

Jusqu'à quel point avez-vous de contrôle sur le processus de téléchargement ? Si vous faites le vôtre, vous pouvez avoir le fichier en cours de téléchargement aller dans un répertoire temporaire ou avoir un nom temporaire jusqu'à ce qu'il soit fini, puis le renommer correctement une fois le téléchargement terminé. Si vous utilisez un logiciel tiers, vous n'avez pas autant de contrôle, mais vous pourriez toujours être en mesure de faire la chose du répertoire temporaire.

3voto

Cd-MaN Points 7911

Rsync peut exclure les fichiers correspondant à certains motifs. Même si vous ne pouvez pas le modifier pour le faire télécharger des fichiers dans un répertoire temporaire, peut-être a-t-il une convention de nommage différent pour les fichiers en cours de téléchargement (par exemple : foo.downloading lors du téléchargement d'un fichier nommé foo) et vous pouvez utiliser cette propriété pour exclure les fichiers encore en cours de téléchargement d'être copiés.

3voto

pjz Points 11925

Si vous avez le contrôle du processus de crawling, ou si sa sortie est prévisible, les solutions ci-dessus (stocker dans un tempfile jusqu'à ce qu'il soit terminé, puis le déplacer vers l'emplacement des téléchargements terminés, ou ignorer les fichiers ayant un nom de type '.downloading') peuvent fonctionner. Si tout cela est hors de votre contrôle, vous pouvez vous assurer que le fichier n'est pas ouvert par un processus en faisant 'lsof $filename' et en vérifiant s'il y a un résultat. Clairement, si personne n'a ouvert le fichier, il est sûr de le déplacer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X