Leer registros de un proceso durante la ejecución de algún comando

10

Tengo algún servicio que produce registros en el archivo logs.log.

Tengo otro comando que interactúa con este servicio. Digamos que es algo foo.sh.

Lo que necesito es cortar y guardar registros logs.logexactamente durante la foo.shejecución. En otras palabras, necesito esa parte de los registros del servicio cuando interactúa con mi foo.sh(por lo que no me importan foo.shlos registros).

Esperaría que este comando haga el truco, pero continúa leyendo el archivo cuando foo.shya ha terminado:

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

¿Hay alguna buena manera de realizar este truco?

Andremoniy
fuente

Respuestas:

12

Esto se hace bastante sencillo enviando sus procesos en segundo plano a, bueno, el fondo:

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

$!captura el PID del último trabajo enviado para ejecutarse en segundo plano, para que podamos waitfinalizar su secuencia de comandos y luego killel tailproceso cuando ya no lo necesitemos.

DopeGhoti
fuente
3
respuesta increíble, aprendí algo nuevo hoy
Miguel Mota
7

Esta versión también puede hacerlo (creo):

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

Tenga en cuenta que% 1 alcanzará el primer proceso en segundo plano en la subshell

Luciano Andress Martini
fuente
Personalmente, prefiero capturar PID explícitos en lugar de usar la lista de trabajos, ya que una implementación cada vez más compleja de esto podría poner más de una tarea en segundo plano y kill %1obtener el objetivo equivocado.
DopeGhoti
1
Como utilicé los paréntesis de la subshell,% 1 se referirá al primer trabajo dentro de la subshell (pero no estoy tan seguro de esto para todas las shells). Obviamente, su solución es más completa y funcional para más casos, pero creo que puede hacer lo que el usuario necesita ... Otro problema es que mi versión necesita al menos la creación de foo_part.log con touch, su versión no.
Luciano Andress Martini