Lo que necesito mostrar es un registro que se actualiza periódicamente. Es un bloque de unas 10 líneas de texto. Estoy usando |tee y funciona ahora mismo. Sin embargo, el rendimiento es menos satisfactorio. Espera un momento y luego genera varios bloques de textos de múltiples actualizaciones (especialmente cuando el programa recién se inicia, lleva bastante tiempo comenzar a mostrar algo en la consola y la primera vez que vi esto, pensé que el programa se estaba bloqueando). Además, se rompe aleatoriamente en medio del último bloque, por lo que es bastante feo de presentar.
¿Hay alguna manera de mejorar esto? (¿Quizás generar menos cada vez y cambiar entre el archivo de salida y la consola con más frecuencia?)
Actualizar: Esto es lo que hay en mi script bash en este momento:
tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log
Respuesta1
Creo que su problema surge de una característica fundamental de las tuberías, es decir, el almacenamiento en búfer.
Las soluciones son complicadas, pero deberías mirar comandos como unbuffer
o script
o stdbuf
.
Quizás algo para detener el almacenamiento en búfer de salida mediante una camiseta como esta:
your_program | stdbuf -o0 tee
PD. No estoy en una consola ahora, así que no puedo intentar esto.
Respuesta2
Utilizo una agrupación de comandos y redirijo la salida a una sustitución de proceso. En el interior, lo hago eco en /dev/tty y en stdout. Luego redirijo stdout y stderr a un archivo. Funciona para mí hasta ahora. Puede anteponer fácilmente la salida con una marca de tiempo y un identificador de proceso si lo desea.
{
#script goes here
} > >(while read TEXT ; do MESSAGE="$(date +"%d.%m.%Y") $(date +"%Hh%Mm%Ss") $LOGPREFIX $TEXT"; echo $MESSAGE; echo $MESSAGE > /dev/tty; done >> $LOGFILE) 2>&1
Respuesta3
script
Correr
$ script -c "your_program" result.log
en lugar de
$ your_program | tee result.log
p.ej script -c "ls" result.log
.
Por cierto: con script
puedes grabar toda la sesión de bash, que comienzas
script result.log
y terminas con
exit
el comando.
Esta respuesta ya está incluida por @curious_cat y es la misma respuesta a esta pregunta:Grabar una sesión de bash