Alternativas para o comando “lsof”?

18

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

Existe algum "lsof" como aplicativos no mundo que não é o windows?

ATUALIZAÇÃO: por ex .: Eu preciso saber que processos usam o diretório "/ home / username"?

    
por LanceBaynes 12.08.2011 / 07:50

5 respostas

17

Sei de fuser , veja se está disponível no seu sistema.

    
por 12.08.2011 / 08:40
15

A Unix Rosetta Stone é um bom recurso para este tipo de perguntas. Ele menciona algumas alternativas para lsof (veja abaixo). No entanto, lsof não é o aplicativo padrão de fato para o que faz.

Se tudo o que você quer é encontrar o (s) ID (s) do processo que possuem um arquivo em particular aberto, então você pode usar fuser em qualquer sistema compatível com POSIX.

Em sistemas operacionais com um diretório /proc , é possível consultar os arquivos abertos por um processo (o inverso do modo de operação mais comum do lsof ) por meio de informações em /proc . Alguns sistemas operacionais têm comandos para isso:

por 13.08.2011 / 01:36
8

Se acontecer de você executar o Solaris, uma alternativa para lsof , que não é instalada por padrão e pode ser bloqueada no ZFS, é pfiles .

por exemplo:

pfiles /proc/*

    
por 12.08.2011 / 10:38
0

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

  • você não tem permissão para ver ou
  • são para arquivos que contêm a string "Permission denied"
( 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 só se importa com os mapeamentos de certos programas, você poderia usar algo mais como:

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
    
por 03.03.2016 / 16:56
0

Minha versão, com apenas um pouco menos de utilitários:

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

Evidentemente, ele pode não lidar com todos os casos específicos, mas está funcionando no meu caso de uso.

    
por 27.08.2016 / 00:48