Joy*_*Jin 2 shell shell-script fish parallel-processing
在 shell 脚本中并行运行命令通常非常有帮助,但我找不到这样做的方法。这可能吗?如果是这样,我将如何实现这一目标?我主要有兴趣为fish.
当我运行的命令需要很长时间才能完成但可以或需要同时运行以减少完成所有操作所需的时间时,它很有用。
最基本的方法是 with &,这个其他答案是正确的。它还提倡nohup但nohup重定向 stdin、stdout 和 stderr,您可能想要也可能不想要。阅读和之间的区别nohup,disown并&做出明智的决定。
另一种方法是parallel。如果您要并行化的命令彼此相似并且您可以制作一种模式,这将非常有用。
该工具的基本变体(来自moreutils,至少在 Debian 中)允许您限制同时运行的作业数量。GNUparallel更先进。如果要运行生成输出的作业,那么以下选项将特别有用:
--group
组输出。每个作业的输出组合在一起,仅在命令完成时打印。首先是标准输出(标准输出),然后是标准错误(标准错误)。[…]
(来源)
(--group默认情况下启用,因此通常您不需要明确使用它。)
--keep-order
-k
保持输出顺序与输入顺序相同。通常,作业完成后将立即打印作业的输出。[...]-k只影响打印输出的顺序 - 而不是运行作业的顺序。
(来源)
有了它们,多个作业的输出将被组织起来,这是您无法从&. 有时你可能不关心输出,但仍然关心序列;就像在我的这个答案中,GNUparallel用于并行化多个curl进程并从每个进程中获取退出状态,保留序列。
在 Debian 中,GNUparallel位于一个名为parallel. 作为一个单独的可执行文件parallel可以从任何 shell 运行。