2016-01-22 30 views
5

Ho un programma che registra l'output in un file * .out durante l'esecuzione. Ho creato uno script bash per eseguire diverse volte, quindi ogni esecuzione scrive su un diverso file * .out. Ho scoperto che potevo tail il più recente file di .out * in questo modo:Coda il file più recente

watch tail $(ls -tr *.out | tail -n1) 

Il problema sembra essere che il riferimento $() sola Viene eseguito una volta. Quindi, al termine della prima esecuzione, watch continua allo tail lo stesso file * .out, anche se ora c'è un nuovo file * .out.

Come posso modificarlo per passare al prossimo file * .out al termine di una corsa?

Ho provato a fare un po 'di annidamento di virgolette e parentesi, ma non capisco i dettagli del riferimento. Le cose sono complicate dal fatto che il watch passa il suo comando a sh, anche se sto usando bash.

Punti bonus: sarebbe bello se questo potesse essere modificato a tail -f invece di ripetere semplicemente watch ogni n secondi.

+2

hm..In realtà non capisco il caso d'uso. Vuoi leggere qualche file in tempo reale? se sì, è più facile usare 'tail -f * .out' – pivanchy

+0

Sono generalmente d'accordo con @pivanchy, anche se vale la pena ricordare che POSIX' tail' non è garantito per gestire più di un file alla volta. – kojiro

+0

@pivanchy questa è la soluzione. Non avevo realizzato che fosse così semplice. –

risposta

2

Ho anche affrontato questo problema e alla fine è venuto a questa soluzione:

watch "ls -t1 | sed q | xargs tail" 

necessario per ottenere un po 'hacky per il bonus. Il comando tail supporta anche un argomento --pid che provoca la perdita di tail non appena il PID di riferimento muore. Suona bene? Ecco qualche modello si può usare:

while true; do ls -t1 | sed q | xargs lsof -F np | sed 's/.\(.*\)/\1/g' | xargs tail -f --pid 2>/dev/null ; done 

Questa tracce fondamentalmente il file più recente e riavvia tail quando si conclude il processo di scrittura di file.

+0

Grazie! Ho appena dovuto aggiungere un semplice filtro di file come questo: 'guarda ls -t1 * .out | sed q | xargs tail "' –

+1

@JeffIrwin Prova anche la modifica Non sta più guardando il file ma seguendo l'output direttamente (con coda) – steffen

+1

La modifica funziona alla grande! Non ho intenzione di provare a capire tutte le condotte. –

1

Quindi, io duplicare un po 'la mia risposta attuale: Tail the most recent file

è possibile utilizzare il comando molto semplice per risolvere il problema:

tail -f *.out 

coda funziona con file multipli troppo ed è possibile usarlo come:

tail -f file1 file2 file3 

Quindi, come potete vedere, è molto potente e facile strumento e non c'è bisogno di giocare con il comando linux s

1

Se tutti i file esistono per cominciare, e si dispone di una moderna implementazione di tail in grado di gestire più file,

tail -f *.out 

sembrerebbe essere la soluzione migliore. Ma se non hai tutti i file per cominciare, sarebbe ancora più semplice se li hai appena creati. *.out si espanderà solo sui file che hai già.

Tuttavia, se non è possibile conoscere i nomi file per tail -f prima di iniziare, sarà necessario riavviare tail se vengono creati nuovi file di out durante la coda.In questo caso, dato che si sta solo scrivendo a ciascuno outfile uno alla volta, si potrebbe fare:

inotifywait -m -e create -q . | while read dir event file; do 
    kill %tail 
    tail -f "$file" & 
done 
kill %tail 

(È possibile che questo richiede inotifywait, che è incluso nel inotify-tools su sistemi basati su Debian come Ubuntu.) E 'orologi la directory corrente per i file appena creati, code a seconda di quale file è stato creato, in background e uccide il precedente comando tail ogni volta che viene creato un nuovo file.

Problemi correlati