python 脚本及其衍生进程的输出通过管道传输到 Linux 中的文本文件

Pipe the output of a python script and its spawned processes to textfile in Linux

我有一个优化,可以在完成时输出状态信息。我正在使用 Python 的多处理库生成几个不同的进程来并行完成工作,但不幸的是它们偶尔会抛出异常,我想将其与一般状态信息一起记录下来。

我目前正在使用 tee 将主进程的输出通过管道传输到文本文件,如下所示但是 none 来自其他进程的打印语句也将发送到这里(我理解这是因为它们是不同的过程并且有不同的标准输出)。

python optimisation.py | tee output.txt & disown

如何确保所有输出最终都在一个文本文件中?我不关心线条是否重叠等等。

在Linux(以及每个Unix-like系统)中,shell总是为每个进程提供三个打开的​​文件描述符。文件描述符编号为 0、1 和 2,并且通常标记为 "standard input"(通常缩写为 "stdin"——尽管它最初是一个 C 库符号,标识通常连接到的缓冲 I/O 结构标准输入)、"standard output"(标准输出)和 "standard error"(标准错误)。 (为简洁起见,我将使用下面的简短版本。)

默认情况下,这些文件描述符都是用来引用终端输入和输出的。当您使用竖线 (|) 语法时,shell 创建称为管道的单向进程间通信机制,并且 "wires" 第一个命令的标准输出到管道的写入端,以及第一个命令的标准输入第二个命令到管道的读取端。未提及的文件描述符将保留其默认值(即第一个命令的标准输入、第二个命令的标准输出和两个命令的标准错误仍然连接到终端)。

通常,Linux/Unix 程序将错误消息和其他诊断信息写入 stderr 描述符。当没有进行 stdout 重定向时,这似乎与 stdout 没有区别(因为两者都连接到终端)。但是当 stdout 被重定向到管道时,stderr 不受影响;它仍然连接到终端。

在您的情况下,您将管道的读取端连接到 tee,它将其标准输入(此处接收您的 python 脚本的标准输出)复制到文件和 its 拥有标准输出(在这种情况下仍然是终端)。当您的 python 脚本抛出异常时,python 解释器将异常信息和堆栈跟踪打印到它的标准错误。由于您没有重定向 stderr,它将转到终端。但是由于您还将脚本的标准输出副本发送到终端(通过 tee),因此一组输出通过 tee 进入终端并且一组直接进入终端并不明显.但是当然 tee 永远不会看到异常信息。

因此,您还可以通过两个简单的操作来保存异常信息。首先,您可以将异常信息保存到一个单独的文件中:

python optimisation.py 2>error.txt | tee output.txt & disown

语法“2>error.txt”告诉 shell 将文件描述符 2 (stderr) 重定向到名为 "error.txt".

的文件

其次,如果您希望将异常信息与脚本的标准输出内联保存,请使用以下语法:

python optimisation.py |& tee output.txt & disown

“|&”语法指定 stdout 和 stderr 都应定向到管道。 (实际上有许多不同的语法可以实现这一点。这个是最简短的。)