Ler logs de um processo durante a execução de algum comando

10

Eu tenho algum serviço que produz logs no arquivo logs.log.

Eu tenho algum outro comando que interage com este serviço. Digamos que é um pouco foo.sh.

O que eu preciso é cortar e salvar logs logs.logexatamente durante a foo.shexecução. Em outras palavras, eu preciso dessa parte dos logs do serviço quando ele interage com os meus foo.sh(para que eu não me importe com foo.shos logs).

Eu esperava que este comando fizesse o truque, mas continua lendo o arquivo quando foo.shjá tiver terminado:

> foo.sh | tail -f logs.log > foo_part.log

Existe alguma maneira legal de executar esse truque?

Andremoniy
fonte

Respostas:

12

Isso é bastante simples, enviando seus processos em segundo plano para, bem, o segundo plano:

foo.sh &
mypid=$!
tail -f /path/to/logs.log > /path/to/partial.log &
tailpid=$!
wait $mypid
kill -TERM $tailpid

$!captura o PID do último trabalho enviado para execução em segundo plano, para que possamos waitconcluir seu script e, em seguida, killo tailprocesso quando não precisarmos mais dele.

DopeGhoti
fonte
3
resposta incrível, aprendi algo novo hoje
Miguel Mota
7

Esta versão também pode fazê-lo (eu acho):

( tail -f logs.log >foo_part.log &
foo.sh&
wait $! && kill %1 ) 

Observe que% 1 atingirá o primeiro processo em segundo plano no subshell

Luciano Andress Martini
fonte
Pessoalmente, prefiro capturar PIDs explícitos do que usar a lista de tarefas, pois uma implementação cada vez mais complexa disso pode colocar mais de uma tarefa em segundo plano e kill %1obter o alvo errado.
DopeGhoti 27/04
1
Como eu usei os parênteses do subshell, o% 1 se referirá ao primeiro trabalho dentro do subshell (mas não tenho tanta certeza disso para todos os shells). Obviamente, sua solução é mais completa e funcional para mais casos, mas acho que ele pode fazer o que o usuário precisa ... Outro problema é que minha versão precisa de pelo menos a criação de foo_part.log com touch, sua versão não.
Luciano Andress Martini