2010-08-09 16 views
1

Sous Ubuntu, si un fichier /A/largefile.foo est déplacé via 'cp' ou 'mv' vers /B/largefile.foo, comment puis-je m'assurer que tout le fichier est écrit avant d'essayer de déplacer le fichier une seconde fois vers /C/largefile.foo? 1. Un script X automatisé à distance lance un rsync vers le dossier de destination A d'un fichier très volumineux. 2. Une tâche cron sur la machine locale se déplace toutes les heures fichiers du dossier A au dossier B, mais je ne veux pas copier des fichiers partiels (je ne veux que les fichiers qui ont fini de télécharger complètement)Comment faire pour assurer l'intégrité de la copie de fichiers dans Ubuntu

Cas: 1. Le travail cron déplace périodiquement les fichiers du dossier B vers le dossier C, mais je ne veux pas copier les fichiers partiels (je veux seulement les fichiers qui ont terminé le téléchargement)

Je suis à la recherche d'une solution qui ne nécessite pas l'ajout de fichiers pid

Répondre

4

Pour la première rsync cas, vous pouvez utiliser l'option --partial-dir combinée avec --delay-updates, il écrit des fichiers partiels à un autre endroit, les renommer en place une fois fait.

Vous devez vous assurer que le répertoire partiel se trouve sur le même système de fichiers que la destination, de sorte que les renames soient atomiques.

pour le deuxième cas, utilisez mv (en supposant à nouveau un système de fichiers) qui sera atomique.

voir le rsync manual pour plus d'informations

+0

Merci, c'est exactement ce que je cherchais! –

1

Une approche courante consiste à copier des fichiers avec un suffixe ".part". Lorsque la copie est terminée, le script renomme le fichier pour supprimer le .part. Votre autre script doit simplement ignorer le fichier .part.

C'est ce que font les gestionnaires de téléchargement, les programmes FTP et autres.

0

opération de déplacement atomique sur un système POSIX au sein de fichiers.

Si vous ouvrez un fichier, puis le supprimez du système de fichiers, vous pouvez toujours écrire dans le fichier. C'est pourquoi nous devons dire à syslogd de rouvrir les handles de fichiers après la rotation des logs.

La solution consiste à écrire d'abord dans un fichier temporaire, puis de le déplacer vers la destination. L'option --delay-updates pour rsync fait exactement cela.

1

Utilisez rsync. Vous pouvez également md5sum le fichier orig et le nouveau fichier sur destination (si cp)