首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将stdout和stderr重定向到管道,但却要遵守命令

如何将stdout和stderr重定向到管道,但却要遵守命令
EN

Stack Overflow用户
提问于 2013-01-17 17:01:29
回答 1查看 487关注 0票数 2

我希望能够独立地从子进程中读取stdout/stderr (以及我正在介绍的一个新的stdlog ),对这些流做一些操作,并以相同的顺序将它们写入屏幕和日志文件。

因此,例如,如果子进程想要将"aa“表示为stdout,则"bb”表示为stderr,然后"cc“再次指向stdout,则需要在屏幕上看到"aabbcc”。如果我看到"aaccbb",我可以容忍它(我想这是没有帮助的),但是我肯定不想看到"aacbbc“(写在一个bug块"cc”中的东西被分割)。

下面是我提出的流程层次结构:

代码语言:javascript
运行
复制
(P) parent process
\_ (O) logger for stdout
\_ (E) logger for stderr
\_ (C) monitored process
  • (C)使用管道将stdout连接到写入日志文件和stdout的(O)进程。
  • (C)使用管道将stderr连接到写入日志文件和stderr的(E)进程。

问题是,根据排定(O)和(E)的时间,一般产出(由(O)和(E)的输出组成)可能会出现混乱。

有什么办法我可以:

  • 有完美的点菜?我想没有但也许有个解决办法..。
  • 至少知道要在(O)和(E)进程中读取多少字节,这样我才能将它们整块地读取?

而且,最好是使用python,并且可以跨unices移植。

注意:代码在github上。整个想法是捕获监视进程的准确输出,并将其存储在日志文件中。在写入来自stderr或stdout的输出之前,先写入日志文件标记,如"\0err\0“或"\0std\0”,以便以后可以重新生成来自进程的准确输出,同时尊重stdout和stderr。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-11-04 20:55:12

如果您将stdout和stderr重定向到同一个管道(即proc1 2>&1 | proc2),那么您就无法控制管道上的顺序,因为它们现在完全相同。stdout和stderr在操作系统中都有相同的路径。

"proc2“读取数据的顺序仅取决于"proc1”写入数据的顺序。该顺序仅依赖于proc1。

通常,一个进程会像这样缓冲数据:

  • stdout被缓冲,但是如果输出是TTY,则刷新每个换行符,否则当缓冲区已满时。
  • stderr是非缓冲的,并且总是立即刷新每一个写。

您可以处理python缓冲区,或者使stdout和stderr完全相同,但最简单的方法可能是尝试python -u ...,使所有输出都不被缓冲。这样,proc1的每个写都应该以相同的顺序出现在proc2上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14384232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档