Eliminé un archivo y ahora veo:
$ ls
total 64
-rw-rw-r-- 1 502 17229 Sep 17 16:42 page_object_methods.rb
drwxrwxr-x 7 502 238 Sep 18 18:41 ../
-rw-rw-r-- 1 502 18437 Sep 18 18:41 new_page_object_methods.rb
-rw-r--r-- 1 502 16384 Sep 18 18:42 .nfs0000000000b869e300000001
drwxrwxr-x 5 502 170 Sep 21 13:48 ./
13:48:11 *vagrant* ubuntu-14 selenium_rspec_conversion
y si trato de eliminarlo:
$ rm .nfs0000000000b869e300000001
rm: cannot remove ‘.nfs0000000000b869e300000001’: Device or resource busy
¿Qué indica esto? Qué tengo que hacer
ps -Af | grep 'indicator-services-start' | awk '{ print $2 }' | xargs kill
acrontab -e
.Respuestas:
Un archivo se puede eliminar mientras está abierto por un proceso. Cuando esto sucede, la entrada del directorio se elimina, pero el archivo en sí (el inodo y el contenido) se quedan atrás; el archivo solo se elimina realmente cuando no tiene más enlaces y ningún proceso lo abre.
NFS es un protocolo sin estado: las operaciones se pueden realizar independientemente de las operaciones anteriores. Incluso es posible que el servidor se reinicie, y una vez que vuelva a estar en línea, los clientes continuarán accediendo a los archivos como antes. Para que esto funcione, los archivos deben ser designados por sus nombres, no por un identificador obtenido al abrir el archivo (que el servidor olvidaría cuando se reinicie).
Ponga los dos juntos: ¿qué sucede cuando un cliente abre un archivo y lo elimina? El archivo debe seguir teniendo nombre, para que el cliente que lo tiene abierto pueda acceder a él. Pero cuando se elimina un archivo, se espera que no exista más archivo con ese nombre después. Por lo tanto, los servidores NFS convierten la eliminación de un archivo abierto en un cambio de nombre: se cambia el nombre del archivo
.nfs…
(.nfs
seguido de una cadena de letras y dígitos).No puede eliminar estos archivos (si lo intenta, todo lo que sucede es que
.nfs…
aparece un nuevo con un sufijo diferente). Eventualmente desaparecerán cuando el cliente que tiene el archivo abierto lo cierre. (Si el cliente desaparece antes de cerrar el archivo, puede pasar un tiempo hasta que el servidor se dé cuenta).fuente
El usuario @mtak en otra pregunta sugiere:
You could try running
fusor /path/to/.nfsto check which process is using the .nfs file. – mtak May 2 '14 at 9:13
^^^^^ Eso funciona ^^^^^ Y anula el proceso ofensivo para que libere el identificador de archivo.
p.ej
¡HURRA! Éxito.
YMMV por supuesto. Puede ser un proceso diferente sentado con el archivo abierto.
El proceso de extracción del rastreador se reinició automáticamente después de que lo maté.
¿Qué es esta cosa de extracto de rastreador? (Veo esto en centos / redhat)
/programming/26737900/tracker-extract-and-tracker-store-processes-consuming-huge-amount-of-ram
fuente
Como NFS es "sin estado", debe haber una manera de emular el método UNIX de abrir un archivo y luego eliminarlo manteniendo un identificador de archivo abierto.
Cualquier operación de archivo NFS provoca la cadena:
open(); seek-last-off(); doit(); close();
para ejecutarse y esta es la razón por la cual NFS sobrevive al reinicio del servidor.
Una vez que el proceso en el cliente que abrió el archivo anterior finaliza, el archivo desaparecerá.
Los servidores de archivos implementados correctamente ejecutarán un script todas las noches que elimine todos los archivos anteriores a una semana. La razón es que en caso de que el cliente se reinicie mientras mantiene dicho archivo, el archivo permanecerá para siempre.
fuente
Es probable que algún otro proceso siga usando el archivo (es decir, tiene un identificador de archivo abierto). O bien ignore el archivo, o use
lsof
o algo similar para tratar de encontrar qué proceso tiene ese archivo abierto (¡o reinicie todo!).fuente
Me enfrenté a una situación similar, pero en mi caso no puedo eliminar un archivo creado por mi propio programa. Estaba seguro de esto porque estaba presente en un directorio creado por mi programa. No sabía dónde y cuándo ejecuté ese programa. Solución: simplemente salí de todas mis terminales. Ingresé nuevamente y simplemente eliminé el archivo.
PD Mi respuesta solo es válida para el escenario que he especificado.
fuente