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