加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

代理stdout / stderr在bash中保持顺序

发布时间:2020-12-15 22:35:34 所属栏目:安全 来源:网络整理
导读:我试图通过以下方式在文件的每一行输出前添加一些信息: 抓住stdout和stderr 预先填写信息 输出到原始句柄 这是我的测试脚本: #!/bin/bash## Test proxying stdout and stderr#function proxy-stdouterr() { local name="$1" local handle=$2 while IFS=''
我试图通过以下方式在文件的每一行输出前添加一些信息:

>抓住stdout和stderr
>预先填写信息
>输出到原始句柄

这是我的测试脚本:

#!/bin/bash
#
# Test proxying stdout and stderr
#

function proxy-stdouterr() {
    local name="$1"
    local handle=$2
    while IFS='' read -r line
    do
        echo -e "[ ${name}: ${line} ]" >&${handle}
    done
}

# Output some messages and attempt to parse them
(
    echo "1: Normal message"
    echo "2: Error" >&2
    echo "3: Normal message"
    echo "4: Error" >&2
) 2> >(proxy-stdouterr "stderr" 2) > >(proxy-stdouterr "stdout" 1)

这工作得相当好,但不保留终端中的顺序(Ubuntu 12.04).

不代理输出时:

1: Normal message
2: Error
3: Normal message
4: Error

但是,当不保留代理订单时.更糟糕的是,这不是确定性的,大部分时间是:

[ stderr: 2: Error ]
[ stderr: 4: Error ]
[ stdout: 1: Normal message ]
[ stdout: 3: Normal message ]

但偶尔:

[ stderr: 2: Error ]
[ stdout: 1: Normal message ]
[ stderr: 4: Error ]
[ stdout: 3: Normal message ]

我怎样才能解决这个问题?

谢谢

解决方法

正如其他人所指出的那样,这是一个没有明显的同步问题
回答时不知道你特别控制哪些部分
并希望改变.

恕我直言有两个主要攻击面:

>流缓冲.大多数C派生程序不缓冲stderr,
如果它们是终端和缓冲区,则按行缓冲stdin和stdout
完全不然.这就解释了为什么斯特德尔总是会来
在你的例子中首先.廉价的警察是使用/usr/bin/echo
而不是内置回声,所以你最后会得到一个刷新的流
每一行(以及过程产生的大量延迟).它解决了
你的例子100%是我尝试过的,所以它对你来说已经足够了
太.如果您可以控制生成行的命令,
确保stdout和stderr都是行缓冲的.
>流程安排.你有两个竞争过程的过程
两个流.如果当时有数据流动,
他们正在相互竞争.你可以减轻它
有一个过程可以做到这一点,但我不确定它是否可能
在原生bash中保持高效(没有可编程的POSIX选择
最终用户可用)

无论如何,如果图片中的任何地方都有排队,那么你就是在保持秩序的情况下搞砸了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读