gpt4 book ai didi

linux - 在不丢失顺序的情况下单独重定向和重新组合 stderr/stdout

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:37 25 4
gpt4 key购买 nike

我想执行一个命令并想重定向 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 按照创建它们的原始顺序。

最佳答案

如果没有一些丑陋的黑客技术,在执行单独的重定向时保持完美的顺序甚至在理论上是不可能的。顺序仅在直接写入(在 O_APPEND 模式下)同一文件时保留;一旦您将 tee 之类的东西放在一个进程中而不是另一个进程中,排序保证就会消失,并且如果不保留有关以什么顺序调用哪些系统调用的信息就无法检索。

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

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

也就是说,这仍然是丑陋的骇客行为:它只捕获直接写入 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

因为我们要关闭输出文件名(stdoutstderr),所以这些文件名必须保持不变才能使上述代码正常工作——任何所需的临时目录都可以被使用。


显然,您实际上不应该执行任何这些操作。更新您的程序以支持其 native 语言(Java 中的 Log4j、Python 日志记录模块等)中可用的任何日志记录基础结构,以允许它的日志记录要明确配置。

关于linux - 在不丢失顺序的情况下单独重定向和重新组合 stderr/stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45760692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com