lsof
tem um formato de saída "pós-processável" com a opção -F
(consulte a seção OUTPUT FOR OTHER PROGRAMS no manual).
lsof -nPMp "$pid" -Fn | sed '
\|^n/|!d
s/ type=STREAM$//; t end
s/ type=DGRAM$//; t end
s/ type=SEQPACKET$//
: end
s|^n||'
Listará arquivos abertos que serão resolvidos em um caminho no sistema de arquivos.
-
-nPM
desabilita parte do processamento quelsof
faz por padrão e que não nos interessa aqui, como resolver endereços IP, nomes de porta ou rpc. -
-p "$pid"
, especifique o processo cujos arquivos abertos devem ser listados -
-Fn
: pela saída do campo. Peça a parte n ame. -
| sed
postar processo comsed
para selecionar apenas a parte em que estamos interessados: -
\|^n/|!d
: pule qualquer coisa que não comece comn/
-
s/ type=...$/;t end
: remova as strings no final da linha e pule para o rótuloend
se for bem-sucedido. -
: end
: o rótuloend
. -
s|^n||
: remova o caracteren
inicial quelsof
insere para identificar o campo que está sendo produzido.
No entanto, observe que caracteres não imprimíveis em nomes de arquivos são codificados (como \n
para nova linha, ^[
para ESC ...) de maneira ambígua (como em ^[
poderia significar ^[
e ESC ).
Além disso, para arquivos excluídos, pelo menos no Linux, você ainda obterá um caminho de arquivo, mas com (deleted)
anexado. Novamente, não há como discriminar entre um arquivo excluído e um arquivo cujo nome termina em (deleted)
. Observar a contagem de links não ajudará necessariamente, pois o arquivo excluído pode estar vinculado em outro lugar.
Veja também a remoção de type=*
que fazemos para sockets de domínio Unix que podem ter realmente ocorrido no nome do arquivo.
O que isso significa é que, embora funcione na maioria dos casos, não é possível pós-processar a saída de forma confiável no caso geral.
Sem mencionar que lsof
pode não conseguir analisar as informações retornadas pelo kernel corretamente, ou que o kernel pode falhar ao fornecer essa informação em um formato confiável e confiável