empêcher rsync de supprimer les fichiers source inachevés

169

J'ai deux machines, la vitesse et la masse. speed a une connexion Internet rapide et exécute un robot qui télécharge beaucoup de fichiers sur le disque. mass a beaucoup d'espace disque. Je veux déplacer les fichiers de la vitesse à la masse une fois le téléchargement terminé. Idéalement, je viens de courir:

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

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

Aaronsw
la source

Réponses:

10

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

S'il s'agit de Linux, il est possible qu'un fichier soit ouvert par le processus A et le processus B peut dissocier 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 ne supprime le fichier source qu'après sa copie, et s'il est toujours en cours d'écriture sur le disque, vous aurez un fichier partiel.

Que diriez-vous de ceci: Montez en masstant que système de fichiers distant (NFS fonctionnerait) dans speed. Ensuite, explorez directement les fichiers sur le Web.

Jason Cohen
la source
9

Quel contrôle avez-vous sur le processus de téléchargement? Si vous lancez le vôtre, vous pouvez faire en sorte que le fichier en cours de téléchargement aille dans un répertoire temporaire ou avoir un nom temporaire jusqu'à ce qu'il soit terminé de télécharger, puis mv au nom correct une fois terminé. Si vous utilisez un logiciel tiers, vous n'avez pas autant de contrôle, mais vous pourrez peut-être toujours faire le répertoire temporaire.

Paul Tomblin
la source
3

Rsync peut exclure les fichiers correspondant à certains modèles. Même si vous ne pouvez pas le modifier pour qu'il télécharge des fichiers dans un répertoire temporaire, il a peut-être une convention de nommer les fichiers différemment lors du téléchargement (par exemple: foo.downloadinglors du téléchargement d'un fichier nommé foo) et vous pouvez utiliser cette propriété pour exclure des fichiers qui sont toujours en cours de téléchargement après avoir été copiés.

Panthère grise
la source
3

Si vous avez le contrôle sur le processus d'exploration, ou s'il a une sortie prévisible, les solutions ci-dessus (stockage dans un fichier temporaire jusqu'à la fin, puis mv'ing à l'endroit des téléchargements terminés, ou ignorant les fichiers avec un type de nom '.downloading') pourrait fonctionner. Si tout cela est hors de votre contrôle, vous pouvez vous assurer que le fichier n'est ouvert par aucun processus en faisant 'lsof $ filename' et en vérifiant s'il y a un résultat. Il est clair que si personne n'a ouvert le fichier, il est prudent de le déplacer.

pjz
la source