Necesito escribir una secuencia de comandos de shell de Unix que mueva los archivos de entrada csv de la carpeta / exp / files al directorio / exp / ready.
Los archivos de entrada csv se escriben en /exp/files
carpeta por un servidor FTP cuyo comportamiento no puedo cambiar trivialmente. En tran.sh
shell script debo asegurarme de que antes de mover ese archivo de entrada csv desde el directorio / exp / files ya no haya ningún otro proceso escrito en el archivo.
Cómo puedo hacerlo.
Respuestas:
No hay una forma portátil de hacerlo. Puedes probar
fuser
,lsof
,inotify
,FAM
, y otros sin embargo.fuente
Intenta usar
fuser [FILE]
. Se devolverá distinto de cero si el archivo no está en uso.Aquí hay un código de ejemplo que esperará a que un archivo esté listo para moverse:
fuente
puedes usar lsof
fuente
La forma correcta de hacer esto es hacer que el proceso de escritura de los archivos y renombrarlos o moverlos por su propia voluntad se realice con la escritura. Cualquier otra cosa es propensa a condiciones de carrera y / o problemas de permisos.
Algunos ejemplos particulares de casos de problemas:
También pueden existir otras condiciones de carrera más sutiles, e independientemente de esto, lsof, fuser y demás no son herramientas POSIX y no están disponibles en todas partes.
Requerir del protocolo que los procesos que escriben los archivos los muevan a la ubicación final al completarse; Es el único enfoque seguro y portátil.
EDITAR: Se ha aclarado que los archivos se escriben no mediante un proceso arbitrario (que puede cerrarlos y volver a abrirlos), sino mediante un servidor FTP. En este caso, incron se puede usar para ejecutar un script arbitrario siempre que un archivo se haya cerrado en este directorio.
fuente
No creo que puedas hacer esto sin modificar los procesos que crean estos archivos. Siempre que tengamos tareas como esta en nuestros sistemas, nos aseguramos de que el proceso que crea el archivo lo haga ejecutable al final. Por lo tanto, el proceso se moverá o postprocesará de alguna otra manera en que dichos archivos puedan verificar el bit ejecutable para asegurarse de que el proceso de origen haya terminado de trabajar con un archivo.
fuente