如何在 bash 中将多个后台作业的数据合并回单个数据流

gue*_*est 3 bash job-control parallelism

我遇到过一些类似的情况,我可以将单核绑定任务分成多个部分,并在 bash 中将每个部分作为单独的作业运行以使其并行化,但我很难将返回的数据整理回单个数据溪流。到目前为止,我的天真的方法必须创建一个临时文件夹,跟踪 PID,让每个线程将其 pid 写入一个文件,然后一旦所有作业完成,读取所有 pid 并将它们按照 PID 生成的顺序合并到一个文件中。有没有更好的方法使用 bash/shell 工具来处理这种多进一出的情况?

Ole*_*nge 8

到目前为止,我的天真的方法必须创建一个临时文件夹,跟踪 PID,让每个线程将其 pid 写入一个文件,然后一旦所有作业完成,读取所有 pid 并将它们按照 PID 生成的顺序合并到一个文件中。

这几乎正​​是 GNU Parallel 所做的事情。

parallel do_stuff ::: job1 job2 job3 ... jobn > output
Run Code Online (Sandbox Code Playgroud)

还有一些额外的好处:

  • 临时文件会自动删除,因此无需清理 - 即使您终止了 GNU Parallel。
  • 您只需要为当前正在运行的作业提供临时空间:已完成作业的临时空间将在作业完成后释放。
  • 如果您希望输出的顺序与输入的顺序相同,请使用--keep-order.
  • 如果您希望不同作业的逐行混合输出,请使用--line-buffer.

GNU Parallel 有很多功能可以将任务分割成更小的作业。也许您甚至可以使用其中之一来创造较小的工作岗位?