Sopprime i messaggi "file troncato" quando si utilizza tail


11

Sto eseguendo la coda di un file di registro usando tail -f messages.loge questo fa parte dell'output:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Fusce eget tellus sit amet odio porttitor rhoncus. 
Donec consequat diam sit amet tellus viverra pellentesque. 
tail: messages.log: file truncated
Suspendisse at risus id neque pharetra finibus in facilisis ipsum.

Mostra tail: messages.log: file truncatedquando il file viene troncato automaticamente e ciò dovrebbe accadere, ma voglio solo tailmostrarmi l'output senza questo messaggio troncato.

Ho provato a usare tail -f messages.log | grep -v truncatedma mi mostra comunque il messaggio.

Esiste un metodo per sopprimere questo messaggio?

Risposte:


15

Quel messaggio viene emesso su stderr come tutti i messaggi di avviso e di errore.

Puoi eliminare tutto l'output dell'errore:

tail -f file 2> /dev/null

O per filtrare solo i messaggi di errore che contengono truncate:

{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1

Ciò significa tuttavia che si perde lo stato di uscita di tail. Alcune shell hanno pipefailun'opzione (abilitata con set -o pipefail) per quella pipeline per segnalare lo stato di uscita tailse fallisce. zshe bashpuò anche segnalare lo stato dei singoli componenti della pipeline nel loro $pipestatus/ $PIPESTATUSarray.

Con zsho bash, puoi usare:

tail -f file 2> >(grep -v truncated >&2)

Ma attenzione che il grepcomando non è atteso, quindi i messaggi di errore se presenti potrebbero essere visualizzati dopo essere tailusciti e la shell ha già iniziato a eseguire il comando successivo nello script.

In zsh, puoi affrontarlo scrivendolo:

{ tail -f file; } 2> >(grep -v truncated >&2)

Questo è discusso nella zshdocumentazione all'indirizzo info zsh 'Process Substitution':

C'è un ulteriore problema con >(PROCESS); quando questo è collegato a un comando esterno, la shell padre non attende il completamento di PROCESS e quindi un comando immediatamente successivo non può fare affidamento sul completamento dei risultati. Il problema e la soluzione sono gli stessi descritti nella sezione MULTIOS nella nota Reindirizzamento :: . Quindi in una versione semplificata dell'esempio sopra:

paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)

(si noti che non sono coinvolti MULTIOS), PROCESS verrà eseguito in modo asincrono per quanto riguarda la shell madre. La soluzione è:

{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)

I processi extra qui vengono generati dalla shell genitore che attenderà il loro completamento.


C'è un motivo per cui preferisci una subshell ( )rispetto a un comando complesso { }?
Tom Hale,

@TomHale. Nessun buon motivo. Vedi modifica. Grazie.
Stéphane Chazelas,

2

Se grepnon si elimina l'output, molto probabilmente viene stampato su errore standard. Il modo più semplice per sbarazzarsene è semplicemente scaricarlo:

tail -f messages.log 2>/dev/null

1
Fa il trucco, ma sopprime anche altri messaggi.
Bas Peeters,

Sì, @ StéphaneChazelas ha una soluzione che è più complessa ma ignora solo il messaggio rilevante.
l0b0

1

Forse aiutare se può essere risolto l'origine di questo errore. È successo perché qualcosa scrive sul file con sovrascrittura ">" non con append ">>".

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.