Alternativas para o comando "lsof"?

20

Em muitos casos, "lsof" não está instalado nas máquinas com as quais tenho que trabalhar, mas a "função" de lsof seria muito necessária (por exemplo, no AIX). : \

Existem "lsof" como aplicativos no mundo não Windows?

UPDATE: por exemplo: preciso saber que processos usam o diretório "/ home / username"?

LanceBaynes
fonte
1
Você poderia ser mais específico, por favor? Quais sistemas além do AIX (que são definitivamente suportados pelo lsof) você tem em mente? Ou existe apenas um tipo específico de uso de lsof que você tem em mente? Geralmente: por que não lsof?
rozcietrzewiacz
Estou usando Linux 2.6.18-92.el5 GNU, e eu não tenho lsof, nem tenho a capacidade de usar lsof :(
SSH Este
Pergunta relacionada: como verificar o arquivo aberto sem lsof
Stéphane Gourichon

Respostas:

20

Eu sei fuser, veja se está disponível no seu sistema.

enzotib
fonte
o que tenho para fornecer o fusor como parâmetro para listar todos os arquivos abertos em um sistema? : O ty!
precisa saber é o seguinte
2
O comando sudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | lesspode mostrar todos os processos que possuem arquivos abertos no sistema de arquivos montado /. Consulte a página de manual para obter ajuda específica.
enzotib 12/08
TY! ele fornece uma saída como esta: pastebin.com/raw.php?i=2z19g6Rk - pesquisei no Google, mas não consigo encontrar nenhuma maneira de gerar ex .: "gnome-screensaver", não "gnome-screensav" - então como posso produzir com nomes de comando amplos? : O
LanceBaynes
ele dá o mesmo resultado para: pastebin.com/raw.php?i=Fe3EJvUv
LanceBaynes
Algo assim:sudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | while read user pid flags rest; do printf '%10s %10s %10s %s\n' $user $pid $flags "$(</proc/$pid/cmdline)"; done | less
enzotib 12/08
15

O Unix Rosetta Stone é um bom recurso para esse tipo de perguntas. Menciona algumas alternativas para lsof (veja abaixo). Observe, no entanto, que lsof é o aplicativo padrão de fato para o que faz.

Se tudo o que você deseja é encontrar os IDs do processo que possuem um arquivo específico aberto, você pode usá-lo fuserem qualquer sistema compatível com POSIX.

Em sistemas operacionais com um /procdiretório, você pode consultar os arquivos abertos por um processo (o inverso do lsofmodo de operação mais comum) através das informações em /proc. Alguns sistemas operacionais possuem comandos para isso:

Gilles 'SO- parar de ser mau'
fonte
8

Se você executar o Solaris, uma alternativa para lsof, que não está instalada por padrão e pode bloquear o ZFS, é pfiles.

por exemplo:

pfiles /proc/*

jlliagre
fonte
2

Minha versão, com apenas um pouco menos de utilidade:

for proc_pid in $(find /proc -maxdepth 1 -name "[0-9]*"); do \
    ls -l ${proc_pid}/fd 2>/dev/null \
    | grep -q "$search_term" \
    && echo "${proc_pid#/proc/}"; \
done

É certo que ele pode não lidar com todos os casos de canto, mas está funcionando no meu caso de uso.

Bryce Schober
fonte
0

Isso deve fazer o truque. Ele fornecerá todos os mapeamentos do descritor de arquivos, exceto aqueles que:

  • você não tem permissão para visualizar ou
  • são para arquivos que contêm a sequência "Permissão negada"
( find /proc -mindepth 1 -maxdepth 1 \
  | grep -E [0-9]+ | xargs -n 1 -I% find %/fd \
  | xargs ls -l \
  | grep -v "Permission denied" ) 2>/dev/null \
| cut -d' ' -f12- | less

Se você já sabe que se importa apenas com os mapeamentos de determinados programas, pode usar algo mais ao longo das linhas de:

exec=sshd
pgrep "$exec" | xargs -n 1 ps -p
pgrep "$exec" | xargs -n 1 -I% find /proc/%/fd | xargs ls -l | cut -d' ' -f12- | less
Tiro Parthian
fonte
-2

Às vezes lsofé instalado em/usr/sbin

Se /usr/sbinnão faz parte do seu $PATH, você pode perder o comando instalado.

Verifique com

whereis lsof
lsof: /usr/sbin/lsof /usr/share/man/man8/lsof.8.gz
Clemente
fonte
O OP disse que o lsof não foi instalado e pediu alternativas ...
Jeff Schaller