Obtendo o PID transitório do log em uma pesquisa PS antes de morrer

2

Eu tenho um processo transitório de prelink preenchendo nosso log de auditoria, mas não temos certeza de qual é o processo. O log de erro nos dá o PID, mas ele desaparece praticamente instantaneamente, como o processo termina quando ocorre um erro, eu acho.

O que eu quero fazer é seguir o log, fazer o grep do PID e colocar isso em um 'ps -p', ou um 'ps -ef | grep PID '.

O que eu tenho até agora é:

ps -p $(tail -f /var/log/audit/audit.log | grep 'comm="prelink"' | grep -o 'pid=[0-9]* ' | grep -o [0-9]*)

Mas eu acho que a expansão do shell não está atualizando, ou seja, eu executo o comando e o PID encontrado na última entrada do log é, digamos, 1234, então o ps só está procurando por isso, e não atualização.

Eu tentei variações em torno de infinitamente looping a saída da cauda em PS, ou em um grep de PS, mas eu não estou chegando a lugar nenhum. Estou executando o tail -f do log por conta própria em outra janela para ver quando é atualizado, e definitivamente é, mas o comando para raspar o PS para que o PID não esteja reagindo.

Alguém pode sugerir uma maneira de alcançar o que estou tentando fazer?

Além disso, existe uma maneira realmente simples e melhor e óbvia de fazer isso? Eu não sou super experiente e tenho o hábito de complicar muito as coisas, então se você tem um "Por que você não faz X", sinta-se livre para jogá-lo!

Obrigado pilhas! B.

    
por JediWombat 24.11.2014 / 02:53

2 respostas

1

Você deve sempre citar expressões como [0-9]* .

tail -f /var/log/audit/audit.log |
  grep --line-buffered 'comm="prelink"' |
  grep --line-buffered -o 'pid=[0-9]* ' |
  grep --line-buffered -o '[0-9]*' |
  while read pid; do
    ps -p "$pid"
  done

tail -f não armazena em buffer sua saída. Para outras aplicações unbuffer ou stdbuf resolvem o problema.

    
por 24.11.2014 / 04:31
0

Você pode sempre executá-lo em um loop infinito e evitar problemas de buffer. Como você presumivelmente não executará isso por muito tempo e poderá pará-lo manualmente, basta executar

while true; do
    ps -p $( tail -n1 /var/log/audit/audit.log | 
             grep -oP 'comm="prelink".*pid=\K[0-9]*' ) 2>/dev/null

Isso imprimirá constantemente a última linha do arquivo, extrairá o PID, se houver, e executará ps -p nele. Ele vai reclamar se não houver PID, então você precisa redirecionar a saída do erro. Eu também combinei seus greps em um único comando. O \K é um recurso da PCRE (ativado por -P ) que significa "esquecer tudo que corresponde até agora". É muito útil combinado com -o para imprimir apenas partes de uma correspondência.

O texto acima não é elegante e vai causar spam na sua CPU com muitos processos, mas deve ser suficiente para uma verificação rápida.

    
por 24.11.2014 / 05:06

Tags