Tengo un proceso por lotes de larga ejecución que genera información de depuración y proceso en stdout. Si solo corro desde un terminal, puedo hacer un seguimiento de "dónde está", pero luego los datos son demasiado y se desplazan fuera de la pantalla.
Si redirijo a la salida a un archivo '> out.txt', eventualmente obtengo toda la salida, pero está almacenada en un búfer, por lo que ya no puedo ver lo que está haciendo en este momento.
¿Hay alguna manera de redirigir la salida pero hacer que no almacene sus escrituras?
Respuestas:
Puede establecer explícitamente las opciones de almacenamiento en búfer de las transmisiones estándar utilizando una
setvbuf
llamada en C (consulte este enlace ), pero si está intentando modificar el comportamiento de un programa existente, intentestdbuf
(parte decoreutils
comenzar con la versión 7.5 aparentemente).Esto amortigua
stdout
hasta una línea:Esto desactiva el
stdout
almacenamiento en búfer por completo:fuente
./configure && make
tarifa estándar . Ni siquiera tiene que instalarlo después, solo puede usar elstdbuf
binario desactivadosrc/
.Puede lograr una salida de línea almacenada en un archivo utilizando el
script
comando de la siguiente manera:fuente
batch_process
si agrega&
el comando anterior, al menos en mi cuadro de Linux), lo que parece como un caso de uso extremadamente común, y b) aquí no hay explicación de cómo funciona este encantamiento.En Ubuntu, el paquete del
unbuffer
programa (delexpect-dev
) hizo el truco para mí. Solo corre:unbuffer your_command
y no lo amortiguará.
fuente
La solución más fácil que encontré (no necesitaba instalar ningún paquete de terceros) se mencionó en un hilo similar en el sitio de Unix y Linux : use el
script
comando. Es viejo y probablemente ya esté instalado.Tenga en cuenta que el primer parámetro de nombre de archivo para el
script
comando es el archivo de registro que se escribirá . Si simplemente ejecutascript -q your_command
, sobrescribirá el comando que sangró para ejecutar con el archivo de registro. Verifiqueman script
, para estar seguro, antes de intentarlo.fuente
prueba el
script
comando; si su sistema lo tiene, toma un nombre de archivo como argumento, todo el texto volcado a stdout se copia en el archivo. Es muy útil cuando un programa de instalación requiere interacción.fuente
Personalmente, prefiero la salida de tubería de un comando que deseo examinar
tee
.script
registra demasiada información, incluida la sincronización de las pulsaciones de teclas y muchos caracteres no imprimibles. Lo quetee
ahorra es mucho más legible para mí.fuente
tee
se ve afectado por el almacenamiento en búfer. Frecuentemente sigo mostrando líneas parciales por tee al dividir la salida de losfind
comandos.Redirija la salida a un archivo y siga el archivo con el
tail -f
comando.Editar
Si esto todavía sufre de almacenamiento en búfer, utilice la función syslog (que generalmente no tiene búfer). Si el proceso por lotes se ejecuta como un script de shell, puede usar el comando logger para hacer esto. Si el trabajo por lotes se ejecuta en un lenguaje de secuencias de comandos, de todos modos debería haber una instalación de registro.
fuente
This answer is useful
respuestas que no funcionan y que posiblemente no pueden funcionar?Puedes usar el
tee
comando, ¡solo magia!someCommand | tee logFile.log
será tanto la pantalla en la consola y escribir en el archivo de registro.fuente
tee
no detendrá el almacenamiento en búfer.tee
no evitará un poco de almacenamiento en búfer, pero solo le permitirá ver cuál es el resultado. Esto es lo que @JamesDean quería (ya que no entendí su pregunta), pero creo que el buffering no es realmente el problema aquí. Si tiene más detalles, hágamelo saber.tee
para obtener una mejor vista de la salida que no se obtiene?>
no ves nada en la consola. Supongo que @JamesDean está usando la palabra "almacenamiento en búfer" para describir eso. Publicaré un comentario sobre su pregunta para que diga más sobre lo que quiere.