script

script

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 unbuffero scripto 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 scriptpuedes grabar toda la sesión de bash, que comienzas script result.log y terminas con exitel comando.

Esta respuesta ya está incluida por @curious_cat y es la misma respuesta a esta pregunta:Grabar una sesión de bash

información relacionada