linux组合重定向,linux – 单独重定向和重新组合stderr / stdout而不会丢失排序

我想执行一个命令,并希望重定向stderr和stdout,如下所示:

stderr和stdout – >应该只保留订单时写入logs.log文件

stderr – >应该打印到SCREEN并写入errors.log

到目前为止,我可以将它们重定向到屏幕和文件log.txt,如下所示:

command 2>&1 | tee logs.log

但以上不是我需要的.

为了更清楚地说明结果需要是什么.

执行命令后,我需要在屏幕上只看到stderr的结果,我需要有一个名为errors.log的文件和stderr,我需要另一个名为logs.log的文件,其中包含stdout和stderr的结果创建它们的原始顺序.

解决方法:

如果没有一些丑陋的hackery,在理论上甚至不可能在执行单独重定向的同时保留完美的顺序.订购仅在写入(在O_APPEND模式下)保存到同一文件中;一旦你将tee之类的东西放在一个进程而不是另一个进程中,排序保证就会出现在窗口中,如果不保留有关以什么顺序调用哪些系统调用的信息,则无法检索.

那么,那个hackery会是什么样子?它可能看起来像这样:

# eat our initialization time *before* we start the background process

sudo 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 file

sudo 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)

也就是说,这仍然是丑陋的hackery:它只捕获直接写入FD 1和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日志记录模块等),以允许显式配置其日志记录.

标签:bash,linux,scripting

来源: https://codeday.me/bug/20190923/1814542.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值