evitar que rsync elimine los archivos fuente sin terminar

169

Tengo dos máquinas, velocidad y masa. speed tiene una conexión rápida a Internet y ejecuta un rastreador que descarga muchos archivos al disco. mass tiene mucho espacio en disco. Quiero mover los archivos de velocidad a masa después de que hayan terminado la descarga. Idealmente, solo correría:

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

pero me preocupa que rsync desvincule un archivo fuente que aún no haya terminado de descargarse. (Miré el código fuente y no vi nada que protegiera contra esto). ¿Alguna sugerencia?

aaronsw
fuente

Respuestas:

10

Me parece que el problema es transferir un archivo antes de que se complete, no es que lo esté eliminando.

Si se trata de Linux, es posible que un archivo se abra mediante el proceso A y el proceso B puede desvincular el archivo. No hay error, pero, por supuesto, A está perdiendo el tiempo. Por lo tanto, el hecho de que rsync elimine el archivo fuente no es un problema.

El problema es que rsync elimina el archivo fuente solo después de que se copia, y si todavía se está escribiendo en el disco, tendrá un archivo parcial.

¿Qué tal esto? Montar masscomo un sistema de archivos remoto (NFS funcionaría) en speed. Luego, simplemente rastree los archivos directamente.

Jason Cohen
fuente
9

¿Cuánto control tienes sobre el proceso de descarga? Si enrollas el tuyo, puedes hacer que el archivo que se está descargando vaya a un directorio temporal o tenga un nombre temporal hasta que termine de descargarse, y luego muévelo al nombre correcto cuando esté listo. Si está utilizando software de terceros, entonces no tiene tanto control, pero aún puede hacer lo del directorio temporal.

Paul Tomblin
fuente
3

Rsync puede excluir archivos que coinciden con ciertos patrones. Incluso si no puede modificarlo para que descargue archivos a un directorio temporal, tal vez tenga la convención de nombrar los archivos de manera diferente durante la descarga (por ejemplo: foo.downloadingmientras descarga un archivo llamado foo) y puede usar esta propiedad para excluir archivos que todavía se están descargando de la copia.

Pantera gris
fuente
3

Si tiene control sobre el proceso de rastreo, o tiene un resultado predecible, las soluciones anteriores (almacenar en un archivo temporal hasta que finalice, luego pasar al lugar de descargas completadas o ignorar los archivos con un tipo de nombre "descargando") Podría funcionar. Si todo eso está fuera de su control, puede asegurarse de que ningún archivo abra el archivo haciendo 'lsof $ filename' y verificando si hay un resultado. Claramente, si nadie tiene el archivo abierto, es seguro moverlo.

pjz
fuente