Como descobrir qual processo está usando um arquivo no Linux?

94

Tentei remover um arquivo no Linux usando rm -rf file_name, mas obtive o erro:

rm: file_name not removed.  Text file busy

Como posso descobrir qual processo está usando este arquivo?

Kris
fonte

Respostas:

137

Você pode usar o fusercomando, como:

fuser file_name

Você receberá uma lista de processos usando o arquivo.

Você pode usar diferentes sinalizadores com ele, a fim de receber uma saída mais detalhada.

Você pode encontrar mais informações no artigo da Wikipédia do fusor ou nas manpáginas.

Jimm-cl
fonte
Eu tentei isso: fuser -i / home / bin / lib. Mas tenho isto: fuser: opção ilegal - i / home / bin / lib: 27674t
khris
1
@khris, pode ser que nem todas as fuserimplementações sejam iguais ou funcionem da mesma maneira. Mesmo que -iseja definido em POSIX, a implementação particular que você está usando não tem necessariamente as mesmas opções que as descritas no artigo da Wikipedia. Por exemplo, estou usando AIX agora, e o fuserdisponível neste sistema também não tem a -iopção.
Jimm-cl
Por algum motivo, nem fusernem lsofestavam trabalhando para mim em um convidado virtualbox. Essa resposta me salvou.
Kael
36

A resposta de @jim está correta - fuseré o que você deseja.

Além disso (ou alternativamente), você pode usar lsofpara obter mais informações, incluindo o nome de usuário, caso precise de permissão (sem ter que executar um comando adicional) para encerrar o processo. (Embora, claro, se matar o processo é o que você deseja, fuserpode fazer isso com sua -kopção. Você pode fuserusar outros sinais com a -sopção - verifique a página de manual para obter detalhes.)

Por exemplo, com uma tail -F /etc/passwdexecução em uma janela:

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

Observe que você também pode usar lsofpara descobrir quais processos estão usando soquetes específicos. Uma excelente ferramenta para ter em seu arsenal.

ghoti
fonte
qual campo é o PID?
nmz787
@ nmz787 - lsof | head -1para ver todos os cabeçalhos.
ghoti
@ nmz787 O segundo campo é o PID.
para
lsof | grep -E "PID|<your_process_name>"mostra a 1ª linha e o processo que você deseja consultar.
Robin Hsu
-1
$ lsof | tree MyFold

Conforme mostrado na imagem anexa:

insira a descrição da imagem aqui

Noção contundente
fonte
1
Como é que isso funciona? Será que treeler qualquer coisa a partir de stdin? Se sim, o que ele faz com essa entrada?
dyp
man lsof - exibe o manual para o comando lsof, lsof - lista os arquivos abertos, lista em seu arquivo de saída padrão informações sobre os arquivos abertos por processos e o resultado pode ser visto em uma estrutura de árvore. você deve verificar o que é lsof claramente
Blunt Notion
1
Minha pergunta é sobre tree, não lsof. Pelo que entendi, treenão lê a entrada padrão, portanto, a saída de lsofé descartada quando você executa lsof | tree .... Se estiver correto, então lsof | tree MyFoldé o mesmo que tree MyFold, que apenas exibe o conteúdo, mas não quais arquivos são abertos por algum processo.
dyp