2012-04-15 14 views
6

Tengo un script de codificación de video que me gustaría ejecutar tan pronto como un archivo se mueva a un directorio específico.Mover archivo a otro directorio una vez que haya terminado la transferencia

Si utilizo algo como inotify, ¿cómo me aseguro de que el archivo no esté codificado hasta que no se mueva?

He pensado en hacer algo como:

  • Copiar (rsync) archivo en un directorio temporal.
  • Una vez finalizado, mueva ('mv' simple) al directorio codificado.
  • Haga que mi secuencia de comandos supervise el directorio de codificación.

Sin embargo, ¿cómo hago para que el paso # 2 funcione correctamente y solo se ejecute una vez que el # 1 esté completo?

Estoy usando Ubuntu Server 11.10 y me gustaría usar bash, pero podría persuadirme de usar Python si eso simplificara los problemas.

No estoy "descargando" archivos en este directorio, per se; más bien usaré rsync la gran mayoría de las veces.

Además, este servidor Ubuntu se ejecuta en una VM.

Tengo mi almacenamiento de archivos principal montado a través de NFS desde un servidor de FreeBSD.

Respuesta

1

Una técnica que uso funciona con FTP. Usted emite un comando al servidor FTP para transferir el archivo a un directorio auxiliar. Una vez que se completa el comando, envía un segundo comando al servidor, esta vez diciéndole que cambie el nombre del archivo desde el directorio auxiliar al directorio de destino final. Si está utilizando inotify o sondeando el directorio, el nombre del archivo no aparecerá hasta que se haya completado el cambio de nombre, por lo tanto, tiene la garantía de que el archivo está completo.

No estoy familiarizado con rsync, así que no sé si tiene una capacidad de cambio de nombre similar.

+0

rsync funciona de la misma manera: el archivo no se mostrará en la lista de archivos que se codificará hasta que se termine de transferir. – javanix

2

La manera más fácil sería descargar utilizando un programa como wget o curl que no sale hasta que el archivo se termine de descargar. De no ser así, no estoy seguro de si es la mejor solución absoluta, pero se puede usar una secuencia de comandos que se repite, comprobando si el archivo está abierto usando lsof y grep:

while lsof | grep /path/to/download >/dev/null; do sleep 5; done 
mv /path/to/download /path/to/encode/dir 
+0

Esto debería funcionar en un apuro, pero me gustaría evitar el sondeo si es posible. – javanix

0

inotifywait parece prometedor. Debe tener cuidado porque si la descarga finaliza antes de que se configure la notificación, esperará por siempre.

inotifywait -e close_write "$download_file" 
mv "$download_file" "$new_location" 
Cuestiones relacionadas