Como descobrir qual processo está impedindo uma quantidade?

26

Quando eu faço

sudo umount /media/KINGSTON

Eu tenho

umount: /media/KINGSTON: device is busy.

Fecho todas as janelas e asseguro que todo o shell esteja apontando para outros diretórios. Como posso descobrir qual processo está impedindo a quantia?

Guillaume Coté
fonte
3
Eu acho que você tem um erro de digitação aqui, duvido que o comando retorne "Como descobrir qual processo está consumindo minha largura de banda?" ...;) alguma chance de você poder editar a pergunta, por favor?
8128

Respostas:

24

abra um terminal:

fuser -c /media/KINGSTON

Ele produzirá algo como isto:

/media/KINGSTON/: 3106c 11086

Isso fornecerá o pid dos processos usando este volume. O caractere 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-o 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 o desmontar

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

Nota: Para encontrar o nome exato do aplicativo desses pids, você pode usar este comando

cat /proc/<pid>/cmdline

Por exemplo : cat /proc/11086/cmdline

isso produzirá algo como abaixo.

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

Espero que isso ajude

aneeshep
fonte
2
O fuser -ck também o mataria.
João Pinto
3
Eu sugeriria matá-los sem a opção -9 primeiro, para dar a esses aplicativos a chance de desligar corretamente. E eu sugeriria usar em ps <pid>vez de editar arquivos em / proc para ver o nome e os argumentos do comando.
Marius Gedminas
Eu sigo o seu procedimento para encontrar o processo, é Thunar - Deamon. Não há caracteres extras dando informações extras. Ainda não o matei, estou preocupado com o impacto que isso poderia ter sobre outra coisa em execução.
Guillaume Coté
7

A ferramenta mais útil é lsof Instale lsof . Ele mostra quais arquivos são usados ​​por quais processos. Se /media/KINGSTONfor um ponto de montagem (o nome do dispositivo também funcionaria), o comando a seguir mostra todos os arquivos que estão em uso nesse ponto de montagem:

lsof /media/KINGSTON

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

A saída de se lsofparece com isso:

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 COMMANDcoluna mostra o nome do programa executável e a PIDcoluna mostra o ID do processo. A NAMEcoluna 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 ainda existe até o último processo de uso fechar o arquivo). USERdeve ser auto-explicativo. As outras colunas não importam aqui, exceto talvez FD, o que mostra como o arquivo é usado pelo processo:

  • cwd: diretório de trabalho atual
  • txt: o programa executável²
  • 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 rpara leitura e wescrita

Não há uma maneira mecânica de localizar a janela em que 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 a outra), nem mesmo a uma maneira simples de identificar a janela de um processo (e é claro que um processo não precisa ter nenhuma janela). Mas geralmente o nome do comando e o nome do arquivo são suficientes para localizar o agressor e fechar o arquivo corretamente.

Se você não conseguir fechar o arquivo e apenas quiser finalizar tudo, poderá encerrar o processo com kill 31421(onde 31421está o ID do processo) ou kill -HUP 31421("desligue"). Se matar simples não faz o truque, matar com extremo preconceito: kill -KILL 31421.

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

¹ 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 é freqüentemente chamado de texto nas discussões de formatos executáveis.

Gilles 'SO- parar de ser mau'
fonte
2

Além disso, isso pode ajudar:

lsof | grep \/media\/KINGSTON
Hashem Masoud
fonte
4
Não há necessidade de escapar das barras.
Marius Gedminas
Quando você não tiver certeza, grep com aspas, por exemplo,grep "media/KINGSTON"
Adam Matan
2

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

$ sudo fuser -ickv /"mountpoint"

Onde:

  • parâmetro kmata o processo ofensivo,
  • enquanto vmostra antecipadamente o processo e seu usuário
  • e ipede sua confirmação.

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

Nestes casos, ultimamente aprendi a usar

$ sudo umount --lazy --force <mountpoint>

como último recurso, que até agora funcionava para mim o tempo todo.

prometheos
fonte
Eu encontrei o processo imortal, minha tentativa fracassada de usar vboxmanage. -_-
sudo