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.
-
-nPMdesabilita parte do processamento quelsoffaz 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. -
| sedpostar processo comsedpara 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ótuloendse for bem-sucedido. -
: end: o rótuloend. -
s|^n||: remova o caractereninicial quelsofinsere 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