bash:强制 exec 进程具有无缓冲的标准输出

标签 bash logging exec unbuffered-output

我有一个像这样的脚本:

#!/bin/bash
exec /usr/bin/some_binary > /tmp/my.log 2>&1

问题是 some_binary 将其所有日志记录发送到 stdout,缓冲使得我只能看到几行大块的输出。当某些东西卡住时,这很烦人,我需要看看最后一行说了什么。

在我执行会影响 some_binary 的 exec 之前,有什么方法可以使 stdout 无缓冲,以便它具有更有用的日志记录吗?

(wrapper脚本只是在exec之前设置了一些环境变量,所以perl或者python的解决方案也是可行的。)

最佳答案

GNU coreutils-8.5 也有 stdbuf修改 I/O 流缓冲的命令:

http://www.pixelbeat.org/programming/stdio_buffering/

因此,在您的示例中,只需调用:

stdbuf -oL /usr/bin/some_binary > /tmp/my.log 2>&1

这将允许文本立即逐行显示(一旦在 C 中用行尾 "\n" 字符完成一行)。如果您真的想要立即输出,请改用 -o0

如果您不想引入对 expect 的依赖,这种方式可能更可取通过 unbuffer 命令。另一方面,如果您必须让 some_binary 认为它面对的是真正的 tty 标准输出,则需要 unbuffer 方法。

关于bash:强制 exec 进程具有无缓冲的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3332045/

相关文章:

bash - 在 grep 期间抑制 Openssl 输出

java - 如何建立通用日志框架

node.js - 如何使用NodeJS和child_process.exec以管理员身份运行程序?

PHP 执行权限被拒绝

linux - bash 编程、后台进程、PID 和等待作业退出

python - 如何在 Linux/Unix 上根据文件类型添加文件扩展名?

mysql 将多行导入为一条记录

javascript - winston 与类 - 为每个文件创建新实例

java - log4J 输出中跳过和重复的行号

c - 为子进程设置时间限制