Suprime los mensajes de 'archivo truncado' cuando utilices tail

11

Estoy siguiendo un archivo de registro usando tail -f messages.logy esto es parte de la salida:

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.

Muestra tail: messages.log: file truncatedcuándo el archivo se trunca automáticamente y se supone que eso sucederá, pero solo quiero tailmostrarme la salida sin este mensaje truncado.

He intentado usar tail -f messages.log | grep -v truncatedpero me muestra el mensaje de todos modos.

¿Hay algún método para suprimir este mensaje?

Bas Peeters
fuente

Respuestas:

15

Ese mensaje se emite en stderr como todos los mensajes de advertencia y error.

Puede descartar toda la salida de error:

tail -f file 2> /dev/null

O para filtrar solo los mensajes de error que contienen truncate :

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

Sin embargo, eso significa que pierde el estado de salida de tail. Algunos shells tienen una pipefailopción (habilitada con set -o pipefail) para que la tubería informe el estado de salida de tailsi falla.zshy bashtambién puede informar el estado de componentes individuales de la tubería en su $pipestatus/ $PIPESTATUSmatriz.

Con zsh o bash, puedes usar:

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

Pero tenga en cuenta que el grepcomando no se espera, por lo que los mensajes de error, si los hay, pueden aparecer después de las tailsalidas y el shell ya ha comenzado a ejecutar el siguiente comando en el script.

En zsh, puede abordar eso escribiéndolo:

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

Eso se discute en la zshdocumentación eninfo zsh 'Process Substitution' :

Hay un problema adicional con >(PROCESS); cuando se adjunta a un comando externo, el shell principal no espera a que finalice el PROCESO y, por lo tanto, un comando inmediatamente posterior no puede confiar en que los resultados se completen. El problema y la solución son los mismos que se describen en la sección MULTIOS en la nota Redirección :: . Por lo tanto, en una versión simplificada del ejemplo anterior:

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

(tenga en cuenta que no hay MULTIOS involucrados), PROCESS se ejecutará de forma asíncrona en lo que respecta al shell padre. La solución es:

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

Los procesos adicionales aquí se generan desde el shell principal que esperará su finalización.

Stéphane Chazelas
fuente
¿Hay alguna razón por la que prefiera una subshell ( )en lugar de un comando complejo { }?
Tom Hale
@TomHale. No hay buena razón Ver editar. Gracias.
Stéphane Chazelas
2

Si grepno se deshace de la salida, lo más probable es que se imprima en un error estándar. La forma más sencilla de deshacerse de eso es simplemente volcarlo:

tail -f messages.log 2>/dev/null
l0b0
fuente
1
Hace el truco, pero también suprime otros mensajes.
Bas Peeters
Sí, @ StéphaneChazelas tiene una solución que es más compleja pero solo ignora el mensaje relevante.
l0b0
1

Quizás ayude si se puede arreglar el origen de este error. Sucedió porque algo escribir en el archivo con sobrescribir ">" no con agregar ">>".

BG Bruno
fuente