Leggi i log da un processo durante l'esecuzione di alcuni comandi


10

Ho un servizio che produce registri nel file logs.log.

Ho qualche altro comando che interagisce con questo servizio. Diciamo che è alcuni foo.sh.

Quello di cui ho bisogno è tagliare e salvare i log logs.logesattamente durante l' foo.shesecuzione. In altre parole, ho bisogno di quella parte dei registri del servizio quando interagisce con il mio foo.sh(quindi non mi importa foo.shdei registri).

Mi aspetterei che questo comando farà il trucco, ma continua a leggere il file quando foo.shè già finito:

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

C'è un modo carino per eseguire questo trucco?

Risposte:


12

Ciò è reso piuttosto semplice inviando i processi in background, beh, allo sfondo:

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

$!acquisisce il PID dell'ultimo lavoro inviato per l'esecuzione in background, così possiamo waitterminare lo script e quindi killil tailprocesso quando non ne abbiamo più bisogno.


3
risposta fantastica, ho imparato qualcosa di nuovo oggi
Miguel Mota,

7

Anche questa versione può farlo (penso):

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

Si noti che% 1 inizierà il primo processo in background nella subshell


Personalmente, preferisco catturare i PID espliciti piuttosto che utilizzare l'elenco dei lavori, poiché un'implementazione sempre più complessa di questo potrebbe mettere più di un compito in background e kill %1potrebbe ottenere l'obiettivo sbagliato.
DopeGhoti,

1
Dato che ho usato le parentesi della subshell, quindi% 1 farà riferimento al primo lavoro all'interno della subshell (ma non ne sono così sicuro per tutte le shell). Ovvio che la tua soluzione è più completa e funzionale per più casi, ma penso che possa fare ciò di cui l'utente ha bisogno .... Un altro problema è che la mia versione necessita almeno della creazione di foo_part.log con il tocco, la tua versione no.
Luciano Andress Martini,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.