在 shell 脚本中同时执行两个或多个命令

在 shell 脚本中同时执行两个或多个命令

在 shell 脚本中并行运行命令通常非常有用,但我找不到这样做的方法。这可能吗?如果可以,我该如何实现?我主要对 感兴趣fish

当我运行需要很长时间才能完成但可以或需要同时运行的命令以减少完成所有操作所需的时间时,它很有用。

答案1

最基本的方法&另一个答案是正确的。它还提倡nohupnohup重定向 stdin、stdout 和 stderr,这可能是您想要的,也可能不是。阅读nohupdisown之间的区别&并做出明智的决定。

另一种方法是parallel如果你想要并行化的命令是彼此相似然后你就可以制作一个图案了。

该工具的基本变体(moreutils至少来自在 Debian 中) 允许您限制同时运行的作业数量。GNUparallel更高级。如果您要运行的作业生成输出,则以下选项将特别有用:

--group
分组输出。每个作业的输出被分组在一起,并且仅在命令完成时打印。首先是 Stdout(标准输出),然后是 stderr(标准错误)。[…]

来源

--group默认启用,因此通常您不需要明确使用它。)

--keep-order
-k
保持输出顺序与输入顺序一致。通常,作业完成后会立即打印输出。[…]-k仅影响打印输出的顺序 - 而不影响运行作业的顺序。

来源

有了它们,多个作业的输出将被组织起来,这是你无法从 获得的&。有时你可能不关心输出,但仍然关心顺序;例如我的这个答案其中 GNUparallel用于并行化多个curl进程并从每个进程获取退出状态,保留序列。

在 Debian GNU 中,parallel它位于一个名为的包中parallel。作为单独的可执行文件,parallel可以从任何 shell 运行。

答案2

最好的方法是将nohup命令前面的内容与&命令末尾的内容结合起来

不清楚你的核心目标是什么,但我希望有帮助!

要在 Linux 机器上以后台进程的形式运行任何命令,你应该在命令前面加上nohup并附加到&末尾。

因此最终的命令是:

nohup [your command] &

意思nohup是命令应该忽略“挂断”,后面&的 & 符号是 shell 命令,告诉系统将该命令作为后台进程运行。有关其用法的更多信息可以在这里找到

当您运行这样的命令时,进程将运行,您将被送回命令提示符,您可以退出终端会话,甚至可以在该终端会话期间执行与该命令无关的其他操作。

相关内容