我希望能够从一个子进程中独立读取 stdout/stderr(以及我正在引入的一个新的 stdlog),对这些流做一些事情,然后将它们写入屏幕和同一个日志文件订单。
因此,例如,如果子进程想对 stdout 说“aa”,然后对 stderr 说“bb”,然后对 stdout 说“cc”,我想在屏幕上看到“aabbcc”。如果我看到“aaccbb”,我可以容忍(我想这没办法),但我肯定不想看到“aacbbc”(写在一个错误 block “cc”中的东西被拆分)。
所以,这是我想出的流程层次结构:
(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 从进程中重新生成准确的输出。
谢谢
请您参考如下方法:
如果您将 stdout 和 stderr 重定向到同一管道(即 proc1 2>&1 | proc2),那么您将无法控制管道上的顺序,因为它们现在完全相同。 stdout 和 stderr 在操作系统中的路径相同。
“proc2”读取数据的顺序仅取决于“proc1”写入数据的顺序。 那个顺序只依赖于 proc1。
通常,进程会像这样缓冲数据:
- stdout 已缓冲,但如果输出是 TTY 则刷新每个换行符,否则当缓冲区已满时。
- stderr 是无缓冲的,每次写入时总是立即刷新。
您可以弄乱 python 缓冲区或使 stdout 和 stderr 完全相同,但也许最简单的方法是尝试 python -u ... 使所有输出都没有缓冲。这样,来自 proc1 的每个写入都应该以相同的顺序出现在 proc2 中。
