Estoy intentando conseguir un sistema que funcione para monitorear registros especiales. Por lo general, solo quiero un patrón muy específico que extraigo usando grep
y una tubería del archivo tail -f
. He notado que grep no genera todo, sino que mantiene algunas líneas almacenadas en el búfer. Supongo que eso tiene sentido si tienes una tubería que generará todo y luego terminará y cerrará la transmisión.
Pero con tail -f
eso no me funciona.
El mismo problema aparece con sed
.
Aquí hay un comando de ejemplo que quiero usar:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g | grep -E --color 'ssh-iptables-perma|$'
Para dar un ejemplo:
La última línea del comando anterior es esta:
2015-05-04 11:17:24,551 [ssh-iptables] Ban x.x.x.x
Y usando este comando:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g
La última línea es esta:
2015-05-04 19:45:17,615 [ssh-iptables] Ban y.y.y.y
Eliminar más tuberías me lleva a las entradas más recientes.
¿Cómo puedo evitar este almacenamiento en caché en las tuberías?
Respuesta1
Agregue grep
la opción --line-buffered
y sed
la opción --unbuffered
.
Respuesta2
Utilice la opción grep
de --line-buffered
.
De forma predeterminada, las utilidades usan búfer de línea si su salida estándar es una terminal, pero usan búferes más grandes (probablemente 4 u 8 kB) cuando su salida está conectada a un descriptor de archivo o una tubería.
Tienes suerte de que tail -F
utiliza el almacenamiento en búfer de línea de forma predeterminada y grep
tiene una opción de línea de comando para habilitarlo. No conozco un método genérico para habilitar el almacenamiento en búfer de línea para un comando arbitrario.