Il monitoraggio di più file con Unix Tail può non funzionare come ci si aspetta
di Allen Fung, Ingegnere software senior
"tail -F" è comunemente usato per monitorare i file per gli aggiornamenti.
Ecco come si può usare la coda per monitorare più file contemporaneamente.
$ coda -F file1 file2
Il problema con il comando di cui sopra è che il testo scritto su file1 e file2 potrebbe non essere scaricato su disco a nuovi confini di linea. Di conseguenza, il testo di un file potrebbe essere unito al testo dell'altro file nell'output di coda.
Ecco un esempio del problema. Supponiamo che il seguente sia scritto su file1.
linea_1
linea_2
linea_3
Inoltre, si supponga che quanto segue sia scritto nel file2.
LINEA_A
LINEA_B
LINEA_C
Se il testo non viene sciacquato ai nuovi confini delle linee, sarà possibile ottenere il seguente output dalla coda.
lineLINE_A
_1
LINEA_B
linea_2
LINEA_C
linea_3
Come si può vedere, "LINE_A" è giuntato in "line_1", con conseguente "lineLINE_A" nella prima riga. Ecco alcuni modi per risolvere il problema di cui sopra.
Eseguire più code in parallelo e tubare l'uscita di ogni coda a grep. Dovrete usare l'opzione in grep per stampare solo ai nuovi confini delle linee.
Scrivere una nuova coda che stampa solo quando riceve una linea completa da un file.
Modificare l'applicazione che ha generato i file di log per creare un unico file di log. Sarà necessario assicurarsi che il testo venga trasferito nel singolo file a nuovi confini di linea.
Ecco il codice da implementare (1) di cui sopra.
$ vi multi-tail.sh
#!/bin/sh
# Quando questo esce, esce anche da tutto il processo di sfondo.
trappola 'uccidi $(posti di lavoro -p)' USCITA
# itera attraverso ciascuno dei nomi dei file dati
per il file in "$@".
fare
# File di coda in background.
coda -F $file | grep -line-buffered "" &
fatto
# Aspetta ... fino a quando CTRL+C
aspetta
Lascio al lettore il compito di implementare (2) e (3).
Grazie per la lettura!