2

我希望能够从子进程中独立读取标准输出/标准错误(以及我正在引入的新标准日志),对这些流执行某些操作,然后以相同的顺序将它们写入屏幕和日志文件。

因此,例如,如果子进程想对 stdout 说“aa”,然后对 stderr 说“bb”,然后再对 stdout 说“cc”,我想在屏幕上看到“aabbcc”。如果我看到“aaccbb”,我可以忍受(我想这无济于事),但我当然不想看到“aacbbc”(写在一个错误块“cc”中的东西被拆分)。

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

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

问题在于,根据 (O) 和 (E) 的调度时间,一般输出(由 (O) 和 (E) 的输出组成)可能会出现故障。

有没有办法我可以:

  • 有完美的订购吗?我想没有,但也许有一个解决方案......
  • 至少确切地知道在 (O) 和 (E) 进程中要读取多少字节,以便我可以将它们整合在一起?

而且,最好使用 python,并且可以跨单元移植。

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

谢谢

4

1 回答 1

0

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

“proc2”读取数据的顺序仅取决于“proc1”写入它们的顺序。 顺序仅取决于 proc1。

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

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

您可以弄乱python缓冲区或使stdout和stderr完全相同,但也许最简单的方法是尝试python -u ...使所有输出都没有缓冲。这样,来自 proc1 的每个写入都应该以相同的顺序出现在 proc2 中。

于 2013-11-04T20:55:12.107 回答