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
setvbufllamada en C (consulte este enlace ), pero si está intentando modificar el comportamiento de un programa existente, intentestdbuf(parte decoreutilscomenzar con la versión 7.5 aparentemente).Esto amortigua
stdouthasta una línea:Esto desactiva el
stdoutalmacenamiento en búfer por completo:fuente
./configure && maketarifa estándar . Ni siquiera tiene que instalarlo después, solo puede usar elstdbufbinario desactivadosrc/.Puede lograr una salida de línea almacenada en un archivo utilizando el
scriptcomando de la siguiente manera:fuente
batch_processsi 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
unbufferprograma (delexpect-dev) hizo el truco para mí. Solo corre:unbuffer your_commandy 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
scriptcomando. Es viejo y probablemente ya esté instalado.Tenga en cuenta que el primer parámetro de nombre de archivo para el
scriptcomando 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
scriptcomando; 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.scriptregistra demasiada información, incluida la sincronización de las pulsaciones de teclas y muchos caracteres no imprimibles. Lo queteeahorra es mucho más legible para mí.fuente
teese ve afectado por el almacenamiento en búfer. Frecuentemente sigo mostrando líneas parciales por tee al dividir la salida de losfindcomandos.Redirija la salida a un archivo y siga el archivo con el
tail -fcomando.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 usefulrespuestas que no funcionan y que posiblemente no pueden funcionar?Puedes usar el
teecomando, ¡solo magia!someCommand | tee logFile.logserá tanto la pantalla en la consola y escribir en el archivo de registro.fuente
teeno detendrá el almacenamiento en búfer.teeno 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.teepara 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.