Saída lsof personalizada

3

Eu preciso de uma lista dos arquivos abertos, portas e assim por diante por um processo. Agora sempre que eu uso lsof -p <PID> eu posso analisar a saída, em um script python, mas o problema é que às vezes eu estou recebendo algumas colunas que estão vazias. Portanto, estou obtendo resultados ruins ao analisar a saída.

Eu sei que posso procurar manualmente os FDs em / proc para cada processo, mas isso deve estar no padrão POSIX. Então, a minha pergunta é, existe alguma maneira de fazer lsof imprimir apenas a lista dos arquivos abertos e nada mais?

Estou pensando em algo como, por exemplo, o comando ps específico do usuário ( ps -eopid,user,comm,command ), onde podemos especificar quais comandos vêm na saída. Nesse caso, quero especificar apenas as colunas "Nome" na lsof -p <PID> output.

    
por BetimNeutron 29.07.2016 / 11:10

1 resposta

3

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 que lsof 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 com sed para selecionar apenas a parte em que estamos interessados:
  • \|^n/|!d : pule qualquer coisa que não comece com n/
  • s/ type=...$/;t end : remova as strings no final da linha e pule para o rótulo end se for bem-sucedido.
  • : end : o rótulo end .
  • s|^n|| : remova o caractere n inicial que lsof 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

    
por 29.07.2016 / 12:06