Comando fuser: Encontrando Processos Usando Arquivos e Diretórios
O Que Você Vai Aprender
- Como encontrar quais processos estão usando um arquivo ou diretório com
fuser - Como rastrear o culpado por trás dos erros
umount"target is busy" / "device is busy" - Como matar processos ocupados com segurança usando
-k,-ie sinais explícitos
Resumo Rápido
- Quer saber quem está usando um arquivo -->
fuser -v <alvo> - Não consegue desmontar um sistema de arquivos -->
fuser -m <ponto_de_montagem>para encontrar o culpado - Confirmou que é seguro parar -->
fuser -ki <alvo>(kill interativo)
Premissas
- Qualquer distribuição (
fuservem no pacotepsmisc) - Os exemplos assumem Ubuntu / systemd
- Operações de montagem e encerramento podem exigir root dependendo do alvo
O Que é o fuser?
Conclusão: O
fuserfaz uma busca reversa -- dado um arquivo, diretório, ponto de montagem ou socket, ele informa quais processos estão atualmente usando-o, com PIDs e tipos de acesso.
ps e top vão de "processo --> o que ele está fazendo". O fuser vai na direção oposta: "qual processo está usando este arquivo agora?"
O uso mais simples passa o alvo como argumento.
$ fuser /var/log/syslog
/var/log/syslog: 742
742 é o PID usando /var/log/syslog. Os PIDs são impressos à direita dos dois pontos. Se nada o estiver usando, nenhum PID é mostrado e o código de saída é diferente de zero.
Se fuser não estiver instalado, instale psmisc (sudo apt install psmisc / sudo dnf install psmisc). O mesmo pacote fornece pstree e killall.
Como Ver Quem Está Usando em Detalhes? (-v)
Conclusão: Adicione
-v(verbose) para obter uma tabela com USER, PID, tipo de ACCESS e COMMAND, para ver quem está usando o arquivo e como.
Um PID simples raramente conta toda a história. -v adiciona contexto.
$ fuser -v /var/log/syslog
USER PID ACCESS COMMAND /var/log/syslog: syslog 742 F.... rsyslogd
Cada letra na coluna ACCESS descreve como o processo está usando o alvo.
| Símbolo | Significado |
|---|---|
c |
diretório atual |
e |
executável sendo executado |
f |
arquivo aberto (omitido na exibição padrão) |
F |
arquivo aberto para escrita (omitido na exibição padrão) |
r |
diretório raiz |
m |
arquivo mmap ou biblioteca compartilhada |
No exemplo, F.... significa que rsyslogd tem o arquivo aberto para escrita. Note que na saída padrão (sem -v), f e F são omitidos -- apenas o PID e as letras finais (c, e, r, m) aparecem.
Como Resolver o Erro umount "target is busy"?
Conclusão: A desmontagem falha porque algum processo está usando um arquivo nesse sistema de arquivos.
fuser -m <ponto_de_montagem>lista todos os processos que o estão usando.
Este é o cenário mais comum.
$ sudo umount /mnt/data
umount: /mnt/data: target is busy.
Com -m, fuser lista todos os processos usando um arquivo no sistema de arquivos montado (o argumento pode ser um ponto de montagem ou um dispositivo de bloco).
$ fuser -vm /mnt/data
USER PID ACCESS COMMAND
/mnt/data: alice 3210 ..c.. bash
alice 3398 F.... vim
Aqui bash (cujo diretório atual está sob /mnt/data) e vim (editando um arquivo) estão usando-o. Tente a correção limpa primeiro.
bash--> executecdpara sair de/mnt/datanesse shellvim--> salve e saia
Somente se um processo em segundo plano persistente permanecer, e você tiver confirmado que é seguro pará-lo, prossiga para encerrá-lo.
Se você passar -m com um diretório simples em vez de um ponto de montagem, todos os processos nesse sistema de arquivos inteiro se tornam alvo. Combine com -M (--ismountpoint) para que fuser só atue quando o argumento for um ponto de montagem real, prevenindo acidentes.
Como Parar Processos Ocupados com Segurança? (-k / -i)
Conclusão:
-kencerra os processos usando o alvo, mas o sinal padrão é SIGKILL (instantâneo). Na prática, combine com-i(interativo) e um sinal explícito.
-k envia um sinal aos processos listados. Sem sinal especificado, o padrão é SIGKILL (-9), encerrando processos sem limpeza.
# Perigoso: SIGKILL em todos os processos em /mnt/data sem confirmacao $ fuser -km /mnt/data
Para evitar acidentes, adicione essas duas flags.
# -i: perguntar antes de encerrar cada processo # -TERM: enviar SIGTERM (gracioso) em vez de SIGKILL $ fuser -kim -TERM /mnt/data
USER PID ACCESS COMMAND /mnt/data: alice 3398 F.... vim Kill process 3398 ? (y/N)
fuser -k encerra processos que estão usando indiscriminadamente. Executá-lo contra áreas do sistema como / (raiz) ou /usr pode derrubar todo o sistema. Sempre confirme os alvos com -v antes de encerrar.
Especifique sinais por nome (-HUP, -TERM, -KILL) ou número. Liste sinais disponíveis com fuser -l.
Como Encontrar o Processo Usando uma Porta? (-n)
Conclusão:
fuser -n tcp <porta>identifica o processo escutando ou usando uma porta TCP/UDP -- útil para erros "Address already in use".
-n <espaco> alterna o namespace. Use tcp ou udp para buscar por número de porta.
# Processo usando porta TCP 80 $ sudo fuser -v -n tcp 80
USER PID ACCESS COMMAND 80/tcp: root 1180 F.... nginx
A forma porta/protocolo fuser 80/tcp produz o mesmo resultado. Quando um servidor não inicia com Address already in use, isso localiza o culpado.
Para investigar portas e sockets em profundidade, ss e lsof fornecem mais detalhes. O fuser se destaca quando você quer identificar um PID que está usando e encerrá-lo imediatamente (com -k). Escolha conforme o propósito.
fuser vs lsof: qual devo usar?
Conclusão: Use
fuserpara identificar um PID ocupado e encerrá-lo na hora; uselsofpara listar e investigar arquivos e portas abertos em detalhes. Eles se sobrepõem, mas seus objetivos diferem.
| Aspecto | fuser | lsof |
|---|---|---|
| Propósito principal | Identificar PIDs + encerrar | Listar/inspecionar arquivos e sockets abertos |
| Saída | PIDs e tipos de acesso (conciso) | Processo, FD, tipo, tamanho, etc. (detalhado) |
| Capacidade de kill | Sim (-k) |
Não (encerre o PID separadamente) |
| Ponto de montagem | -m é feito para isso |
+D / +f como alternativas |
| Pacote | psmisc |
lsof |
Para "encontrar e parar imediatamente o que bloqueia uma desmontagem", fuser -m é o caminho mais curto. Para "investigar o que está acontecendo com calma", use lsof.
Copiar e colar: template para resolver busy
# 1) Identificar o culpado (sem kill) fuser -vm /mnt/data # 2) Apos confirmar que e seguro, parar interativamente com SIGTERM fuser -kim -TERM /mnt/data # 3) Desmontar novamente sudo umount /mnt/data