栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

分别重定向和重组stderr / stdout,而不会丢失顺序

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

分别重定向和重组stderr / stdout,而不会丢失顺序

从理论上讲,如果没有一些丑陋的黑客手段,则在执行单独的重定向时保持完美的顺序是不可能的。
仅在直接写入同一文件(在O_APPEND模式下)时保留顺序。一旦您将类似的内容

tee
放入一个过程而不是另一个过程中,则排序保证就会消失,并且如果不保留有关以什么顺序调用了哪些系统调用的信息,就无法检索到排序保证。

那么,这种黑客将是什么样子?它可能看起来像这样:

# eat our initialization time *before* we start the background processsudo sysdig-probe-loader# now, start monitoring syscalls made by children of this shell that write to fd 1 or 2# ...funnel content into our logs.log filesudo sysdig -s 32768 -b -p '%evt.buffer'   "proc.apid=$$ and evt.type=write and (fd.num=1 or fd.num=2)"   > >(base64 -i -d >logs.log)   & sysdig_pid=$!# Run your-program, with stderr going both to console and to errors.log./your-program >/dev/null 2> >(tee errors.log)

也就是说,这仍然是丑陋的骇客:它只捕获直接写入FD 1和FD
2的消息,并且不会跟踪可能发生的任何进一步重定向。(可以通过执行对FIFO的写操作,并使用sysdig跟踪对这些FIFO的写操作来改善这一点;这种方式

fdup()
和类似的操作将按预期工作;但是上述内容足以证明这一概念)。


明确进行 单独处理 __

在这里,我们演示如何使用此方法仅对stderr着色,并让stdout保持不变-通过告诉

sysdig
生成JSON流作为输出,然后对其进行迭代:

exec {colorizer_fd}> >(  jq --unbuffered --arg startColor "$(tput setaf 1)" --arg endColor "$(tput sgr0)" -r '    if .["fd.filename"] == "stdout" then      ("STDOUT: " + .["evt.buffer"])    else      ("STDERR: " + $startColor + .["evt.buffer"] + $endColor)    end  ')sudo sysdig -s 32768 -j -p '%fd.filename %evt.buffer'   "proc.apid=$$ and evt.type=write and proc.name != jq and (fd.num=1 or fd.num=2)"   >&$colorizer_fd   & sysdig_pid=$!# Run your-program, with stdout and stderr going to two separately-named destinations./your-program >stdout 2>stderr

因为我们要取消输出文件名(

stdout
stderr
),所以对于上面的代码来说,这些文件名必须是常量-可以使用所需的任何临时目录。


显然,您实际上不应执行任何此类操作。
更新程序以支持其本国语言(Java中的Log4j,Python日志记录模块等)可用的任何日志记录基础结构,以允许对其日志记录进行显式配置。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/405609.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号