GNU/Linux >> Tutoriales Linux >  >> Linux

¿Determinar si el archivo está en proceso de escritura?

Solución 1:

Su mejor apuesta es usar lsof para determinar si un archivo ha sido abierto por algún proceso:

#  lsof -f -- /var/log/syslog
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
rsyslogd 1520 syslog    1w   REG  252,2    72692 16719 /var/log/syslog

No se puede saber fácilmente si está en proceso de escritura, pero si se está escribiendo, DEBE estar abierto.

Editar:¡resolvamos el problema real aquí en lugar de intentar implementar la solución propuesta!

Use rsync para transferir el archivo:

○ → rsync -e ssh remote:big.tar.gz .

De esta forma, el archivo no se copiará sobre el existente, sino que se copiará en un archivo temporal (.big.tar.gz.XXXXXX ) hasta que se complete la transferencia, luego se mueve a su lugar.

Solución 2:

Está en el camino correcto, cambiar el nombre del archivo es una operación atómica, por lo que realizar el cambio de nombre después de la carga es simple, elegante y no propenso a errores. Otro enfoque que se me ocurre es usar lsof | grep filename.tar.gz para verificar si otro proceso está accediendo al archivo.

Solución 3:

Un poco viejo, pero la mayoría de las respuestas pierden por completo el punto de la pregunta:

Pero pensé que primero trataría de averiguar si hay simplemente una forma de determinar si el archivo está completo en la línea de comandos...

En general, no lo hay. Simplemente no tienes suficiente información para determinar eso.

Porque determinar que el archivo está cerrado no es lo mismo que determinar si el archivo está completo . Por ejemplo, un archivo se "cerrará" si la conexión se pierde en medio de la transferencia.

Solo la respuesta de @Alex acertó. E incluso él se enamoró de usar lsof algo.

Para determinar si el archivo se ha transferido completamente y con éxito, se necesitan más datos. Tales como:

Una alternativa en la que estaba pensando era copiar el archivo con una extensión de archivo diferente (como .tar.gz.part ) y luego renombrado a .tar.gz después de que se complete la transferencia.

Esa es una forma perfecta de comunicar que el archivo se ha transferido completa y correctamente. También puede mover archivos de un directorio a otro siempre que permanezca dentro del mismo sistema de archivos. O haz que el remitente envíe un filename.done vacío archivo para señalar la finalización.

Pero todos los métodos tienen que depender de que el remitente indique de alguna manera que la transferencia se ha completado con éxito. Porque solo el remitente tiene esa información.

Algunos formatos de archivo (como los PDF) contienen datos que le permiten determinar si el archivo está completo. Pero tienes que abrir y leer casi todo el archivo para averiguarlo.

lsof solo le dirá que el archivo ya no está abierto, no le dirá por qué ya no está abierto. Tampoco le dirá qué tan grande se supone que es el archivo.

Solución 4:

La mejor manera de hacer esto es usar incron ("inotify cron system"). Le permite configurar un reloj de notificación en un directorio que luego le notificará las operaciones de archivos. En este caso, debe buscar en el directorio un close_write. Eso le permitirá ejecutar su comando una vez que el archivo se haya cerrado después de una escritura.

Solución 5:

Parece que lsof puede detectar en qué modo está abierto un archivo:

lsof -f -- a_file
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
cat     52391 bob    1w   REG    1,2       15 19545007 a_file

¿Ves donde dice 1w? Eso significa que el número del descriptor del archivo es 1 y el modo es w, o escribir.


Linux
  1. 7 formas de determinar el tipo de sistema de archivos en Linux (Ext2, Ext3 o Ext4)

  2. ¿Cómo determinar qué proceso está creando un archivo?

  3. ¿El valor máximo de la identificación del proceso?

  4. El Bash'?

  5. ¿Está Mv Atomic en el Fs?

Introducción al sistema de archivos de Linux

Uso del archivo de configuración SSH

¿Por qué bifurcar mi proceso hace que el archivo se lea infinitamente?

¿Cómo puedo determinar qué proceso tiene un archivo abierto en Linux?

Recuperar el archivo eliminado que se está escribiendo actualmente

¿Qué archivo en /proc lee el kernel durante el proceso de arranque?