¿Cómo saber qué proceso está utilizando un archivo en Linux?

92

Intenté eliminar un archivo en Linux usando rm -rf file_name, pero obtuve el error:

rm: file_name not removed.  Text file busy

¿Cómo puedo saber qué proceso está utilizando este archivo?

Khris
fuente

Respuestas:

137

Puede usar el fusercomando, como:

fuser file_name

Recibirá una lista de procesos que utilizan el archivo.

Puede usar diferentes banderas con él para recibir una salida más detallada.

Puede encontrar más información en el artículo de Wikipedia del fusor o en las manpáginas.

jimm-cl
fuente
Intenté esto: fuser -i / home / bin / lib. Pero tengo esto: fuser: opción ilegal - i / home / bin / lib: 27674t
khris
1
@khris, puede ser que no todas las fuserimplementaciones sean iguales o funcionen de la misma manera. Incluso si -iestá definido en POSIX, la implementación particular que está utilizando no tiene necesariamente las mismas opciones que las descritas en el artículo de Wikipedia. Por ejemplo, estoy usando AIX en este momento, y el fuserdisponible en este sistema tampoco tiene la -iopción.
jimm-cl
Por alguna razón, ni fuserni lsofestaban trabajando para mí en un invitado de virtualbox. Esta respuesta me salvó.
kael
34

La respuesta de @ jim es correcta, fuseres lo que quieres.

Además (o alternativamente), puede usar lsofpara obtener más información, incluido el nombre de usuario, en caso de que necesite permiso (sin tener que ejecutar un comando adicional) para finalizar el proceso. (Aunque, por supuesto, si lo que desea es matar el proceso, fuserpuede hacerlo con su -kopción. Puede fuserusar otras señales con la -sopción; consulte la página del manual para obtener más detalles).

Por ejemplo, con una tail -F /etc/passwdejecución en una ventana:

ghoti@pc:~$ lsof | grep passwd
tail      12470    ghoti    3r      REG  251,0     2037 51515911 /etc/passwd

Tenga en cuenta que también puede utilizar lsofpara averiguar qué procesos utilizan sockets particulares. Una excelente herramienta para tener en tu arsenal.

ghoti
fuente
¿Qué campo es el PID?
nmz787
@ nmz787 - lsof | head -1para ver todos los encabezados.
ghoti
@ nmz787 El segundo campo es el PID.
para el
lsof | grep -E "PID|<your_process_name>"muestra tanto la primera línea como el proceso que desea consultar.
Robin Hsu
0
$ lsof | tree MyFold

Como se muestra en la imagen adjunta:

ingrese la descripción de la imagen aquí

Noción contundente
fuente
1
¿Como funciona esto? ¿ treeLee algo de stdin? Si es así, ¿qué hace con esa entrada?
dyp
man lsof: muestra el manual del comando lsof, lsof: enumera los archivos abiertos, enumera en su archivo de salida estándar información sobre los archivos abiertos por los procesos y el resultado se puede ver en una estructura de árbol. debe verificar lo que es lsof claramente
Blunt Notion
Mi pregunta es sobre tree, no lsof. Por lo que tengo entendido, treeno lee de la entrada estándar, por lo tanto, la salida de lsofse descarta cuando ejecuta lsof | tree .... Si eso es correcto, entonces lsof | tree MyFoldes lo mismo que tree MyFold, que solo muestra el contenido, pero no qué archivos abre algún proceso.
dyp