当前位置: 首页 > 知识库问答 >
问题:

如何将stdout和stderr重定向到管道,但保持其有序性

甘英光
2023-03-14

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

例如,如果子进程想对stdout说“aa”,然后对stderr说“bb”,然后再对stdout说“cc”,我想在屏幕上看到“aabbcc”。如果我看到“aaccbb”,我可以容忍它(我想这是没办法的),但我肯定不想看到“aacbbc”(用一个bug块“cc”编写的东西被拆分)。

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

(P) parent process
\_ (O) logger for stdout
\_ (E) logger for stderr
\_ (C) monitored process
  • (C) stdout使用管道连接到(O)进程,该进程写入日志文件和stdout

问题是,根据(O)和(E)的调度时间,一般输出(由(O)和(E)的输出组成)可能会出现无序。

有没有办法:

  • 有完美的订单吗?我想没有,但也许有一个解决方案…

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

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

谢谢你

共有1个答案

孟和怡
2023-03-14

如果您将stdout和stderr重定向到同一个管道(即Proc1 2

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

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

  • stdout被缓冲,但如果输出是TTY,则刷新每个换行符,否则当缓冲区已满时。
  • stderr是无缓冲的,每次写入都会立即刷新。

您可以乱搞python缓冲区或将stdout和stderr设置为完全相同的东西,但也许最简单的方法是尝试python-u...以使所有输出不受缓冲。有了它,来自Proc1的每次写入都应该以相同的顺序出现在Proc2。

 类似资料:
  • 问题内容: 我在cyberciti.biz的评论中看到了这个有趣的问题。 我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。 到目前为止,我对解决方案的想法是: 但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。 欢迎与您分享这个想法。:) 问题答案: 你要 这里的顺序很重要。假设stdin(fd 0),stdout(fd 1)和stderr(fd 2)最初都连接到tty,因此 首先

  • 我想将stdout和stderr重定向到一个文件,同时保留输出顺序,然后还将stderr显示到屏幕上。我看到很多问题讨论它: https://unix.stackexchange.com/questions/9646/show-only-stderr-on-screen-but-write-both-stdout-and-stderr-to-file https://unix.stackexcha

  • 问题内容: 我想通过python从目录中调用脚本(它们是可执行的shell脚本)。 到现在为止还挺好: 现在我想要的是:假设我有一个具有启动功能的bash脚本。我从那里打电话 回声“某事” 现在,我想看看sys.stdout和退出代码上的回显。我相信您可以使用.communicate()执行此操作,但是我的操作不符合我的预期。 我究竟做错了什么? 任何帮助深表感谢 问题答案: 授予http://d

  • 问题内容: 我想将子进程的stderr输出重定向到stdout。常量应该这样做,不是吗? 然而, 确实 输出了一些东西。为什么会这样,如何在stdout上得到错误消息? 问题答案: 仔细阅读源代码即可得出答案。特别是,该文档在显示以下内容时会产生误导: 表示(…)的特殊值表示标准错误应与标准输出进入同一 句柄 。 由于在求值时stdout设置为“默认”(技术上来说),因此stderr也设置为“默认

  • 问题内容: 要将 stdout 重定向到Bash中的截断文件,我知道使用: 为了重定向Bash中的 stdout ,将其附加到文件中,我知道要使用: 要将 stdout 和 stderr 都重定向到截断的文件,我知道使用: 如何将 stdout 和 stderr 都重定向到文件?没有为我工作。 问题答案: Bash执行从左到右的重定向,如下所示: :以追加模式打开并在那里重定向。 :重定向到 “当

  • 我有一个调用函数的PowerShell脚本。我正在努力实现所有这些,但不确定如何实现: 将标准输出写入控制台并输出。txt 将STDERR写入控制台并输出。txt和err。txt 确保所有STDOUT和STDERR输出仍按其生成的顺序 这就是我到目前为止所拥有的将STDOUT和STDERR写入文件的功能,但它不能完成我需要的其余部分。