Tengo un guión como:bash: proceso exec'd fuerza para tener la salida estándar sin búfer
#!/bin/bash
exec /usr/bin/some_binary > /tmp/my.log 2>&1
problema es que some_binary
envía toda su registro a la salida estándar, y buffering hace de manera que sólo veo salida en trozos de algunas líneas. Esto es molesto cuando algo se atasca y necesito ver lo que dice la última línea.
¿Hay alguna manera de hacer stdout sin búfer antes de hacer el ejecutivo que afectará a some_binary por lo que tiene un registro más útil?
(El guión envoltorio sólo se está estableciendo un par de variables de entorno antes de que el ejecutivo, por lo que una solución en Perl o Python también sería factible.)
La respuesta de Dennis es * exactamente * correcta. Este es el por qué. Los programas en Unix que usan C stdio para salida almacenan en búfer cuando la salida no va a un terminal (aumenta mucho el rendimiento) a menos que se indique que no con 'setvbuf'; casi nadie se molesta con eso. El sistema 'expect' (del cual' unbuffer' es una aplicación trivial) usa magia negra con dispositivos pseudo-terminales de Unix (ptys) para ejecutar programas con un terminal que no es un terminal real para que el programa envuelto no almacene su salida. Es inteligente, pero tenga cuidado: la mayoría de los sistemas solo tienen un número limitado de ptys; un programa naturalmente sin buffer es mejor. –
Por cierto, esto no funciona tan bien en Windows. Esto se debe a que en esa plataforma se espera que use magia de depuración en lugar de magia terminal (porque esta es un área donde Windows es * muy * diferente). –
Gracias. Decidí optar por modificar 'some_binary' para hacer lo correcto en lugar de confiar en la magia negra. 'expect' es genial, pero no lo quiero aquí ... – bstpierre