Como descubro qual processo está impedindo um desmembramento?

22

Quando faço

sudo umount /media/KINGSTON

Eu tenho

umount: /media/KINGSTON: device is busy.

Eu fecho todas as janelas e me certifico de que todos os shell estão apontando para outros diretórios. Como posso encontrar qual processo está impedindo o desmembramento?

    
por Guillaume Coté 06.11.2010 / 08:25

4 respostas

21

abra um terminal:

fuser -c /media/KINGSTON

Será produzido algo assim:

/media/KINGSTON/: 3106c 11086

Isso lhe dará o pid dos processos usando este volume. O personagem extra no final do pid dará algumas informações extras. (c em 3106c)

c - o processo está usando o arquivo como seu diretório de trabalho atual
m - o arquivo é mapeado com o mmap
o - o processo está usando como um arquivo aberto
r - o arquivo é o diretório raiz do processo
t - o processo está acessando o arquivo como um arquivo de texto. y - esse arquivo é o terminal de controle do processo

Então, para desmontar, basta matar os pids e tentar novamente a desmontagem

sudo kill -9 3106 11086
sudo umount /media/KINGSTON

Nota: Para encontrar o nome exato da aplicação destes pids você pode usar este comando

cat /proc/<pid>/cmdline

Por exemplo: cat /proc/11086/cmdline

isto produzirá algo como abaixo.

    evince^@/media/KINGSTON/Ubuntu-guide.pdf^@

Espero que isso ajude

    
por aneeshep 06.11.2010 / 09:01
7

A ferramenta mais útil é o lsof . Ele mostra quais arquivos estão em uso por quais processos. Se /media/KINGSTON for um ponto de montagem (o nome do dispositivo também funcionaria), o comando a seguir mostrará todos os arquivos em uso neste ponto de montagem:

lsof /media/KINGSTON

Se você executar este comando como um usuário comum, ele só mostrará seus próprios processos¹. Execute sudo lsof /media/KINGSTON para ver todos os processos dos usuários.

A saída de lsof é assim:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
zsh4    31421 gilles  cwd    DIR    8,1     4096 130498 /var/tmp
zsh4    31421 gilles  txt    REG    8,1   550804 821292 /bin/zsh4
zsh4    31421 gilles  mem    REG    8,1    55176 821326 /usr/lib/zsh/4.3.10/zsh/complist.so
zsh4    31421 gilles   12r   REG    8,1   175224 822276 /usr/share/zsh/functions/Completion.zwc

A coluna COMMAND mostra o nome do executável do programa e a coluna PID mostra o ID do processo. A coluna NAME mostra o nome do arquivo; você pode ver (deleted) se o arquivo foi excluído enquanto aberto (quando um arquivo é excluído, ele não tem mais um nome, mas ele ainda existe até que o último processo usando ele feche o arquivo). USER deve ser autoexplicativo. As outras colunas não importam aqui, exceto talvez FD , que mostra como o arquivo é usado pelo processo:

  • cwd : diretório de trabalho atual
  • txt : o executável do programa²
  • mem : um arquivo mapeado na memória (aqui, pense nele como um arquivo aberto)
  • um número: um arquivo aberto real; uma letra subsequente indica o modo de abertura, como r para leitura e w para gravação

Não existe uma maneira mecânica de localizar a janela onde um arquivo está aberto (isso não é tecnicamente significativo: se um processo tiver várias janelas, um arquivo não está particularmente associado a uma janela ou outra), nem mesmo qualquer simples maneira de identificar a janela de um processo (e, claro, um processo não precisa ter janelas). Mas geralmente o nome do comando e o nome do arquivo são suficientes para localizar o ofensor e fechar o arquivo corretamente.

Se você não conseguir fechar o arquivo e apenas terminar tudo, poderá eliminar o processo com kill 31421 (onde 31421 é o ID do processo) ou kill -HUP 31421 ("desligar"). Se matar simples não resolver o problema, mate com extremo preconceito: kill -KILL 31421 .

Existe uma GUI para lsof, glsof , mas ainda não está pronta para o horário nobre e não é empacotado para o Ubuntu até agora.

O Lsof pode listar algumas informações sobre os processos de outros usuários, mas não detecta o ponto de montagem, portanto, não os listará se você especificar um ponto de montagem.
² O código executável costuma ser chamado de texto nas discussões de formatos executáveis.

    
por Gilles 06.11.2010 / 13:59
2

Além disso, isso pode ajudar:

lsof | grep \/media\/KINGSTON
    
por Hashem Masoud 06.11.2010 / 09:02
2

Enquanto isso, o comando do fusor melhorou muito. Você pode fazer o trabalho completo com um único comando:

sudo fuser -ickv /"mountpoint"

Onde:

  • o parâmetro k mata o processo ofensivo,
  • enquanto v mostra antecipadamente o processo e seu usuário
  • e i pedem confirmação.

Se algum processo resistir, tente novamente com fuser -ickv -9 (ou mais geralmente com -SIGNAL ) que mata os mais teimosos.
Mas você sempre encontrará algum processo "imortal" ...!

    
por prometheos 14.01.2016 / 01:56