如何在bash中并行运行命令?

如何在bash中并行运行命令?,bash,shell,Bash,Shell,以前有人问过这个问题,有很多答案,但我的需求更具体一些: 我需要运行的进程都是长时间运行的进程,通常不会结束 我不想只在后台运行它们,因为我需要查看它们的输出 如果任何进程退出,我希望其余进程也自动终止 如果我在用于运行它们的主命令上使用Ctrl+C或其他信号,我希望终止所有进程 例如,使用&+wait不满足最后一点。GNU parallel看起来相当复杂,可能能够做到这一点,但我找不到一个好的例子来使用它。您可以使用xargs-P0 -p最大进程,-max procs=max procs

以前有人问过这个问题,有很多答案,但我的需求更具体一些:

  • 我需要运行的进程都是长时间运行的进程,通常不会结束
  • 我不想只在后台运行它们,因为我需要查看它们的输出
  • 如果任何进程退出,我希望其余进程也自动终止
  • 如果我在用于运行它们的主命令上使用Ctrl+C或其他信号,我希望终止所有进程
例如,使用
&
+
wait
不满足最后一点。GNU parallel看起来相当复杂,可能能够做到这一点,但我找不到一个好的例子来使用它。

您可以使用xargs-P0


-p最大进程,-max procs=max procs 一次运行最多个进程;默认值为1。如果max procs为0,xargs将一次运行尽可能多的进程。使用-n选项或 带-P的-L选项;否则,很可能只会执行一个exec。当xargs运行时,您可以向其进程发送一个SIGUSR1信号以增加 要同时运行的命令数,或使用SIGUSR2减少命令数。不能将其增加到实现定义的限制(即 显示为--show limits)。不能将其减少到1以下。xargs从不终止其命令;当要求减少时,它只需等待一个以上的前 正在执行命令以在启动另一个命令之前终止

我需要运行的进程都是长时间运行的进程,通常不会结束

我会让他们使用你的操作系统的初始化系统来提供系统服务。让设计用于管理长时间运行的流程的系统管理您的长时间运行的流程。为什么要花费精力重新设计一个好的init系统已经具备的所有功能,如自动重启、日志管理和服务间依赖性

让我们假设您的init系统是,这就是现代Red Hat和Debian发行版所使用的

我不想只在后台运行它们,因为我需要查看它们的输出

systemd自动捕获标准输出和标准输出,并将它们保存在日志中。像
systemctl status
journalctl
这样的命令提供了许多查看和搜索日志数据的方法。您可以按严重性级别、时间或许多其他元数据字段进行筛选。您可以查看单个服务的输出,也可以查看多个服务的组合输出

如果任何进程退出,我希望其余进程也自动终止

systemd允许您使用
BindsTo=
Requires=
或其他类似选项来表达这一点。有关详细信息,请参阅

如果我在用于运行它们的主命令上使用Ctrl+C或其他信号,我希望终止所有进程

您可以使用
systemctl stop
停止服务。它将停止命名服务及其依赖项

有关systemd可以为您做的所有事情的示例,请阅读其手册:


在摆弄了一段时间GNU
parallel
之后,这似乎可以满足我的需要

将我需要运行的脚本添加到我的Makefile中,以便它们可以作为
makeconsumer
makeproject
makerun
使用

现在我将它们并行运行,如下所示:

parallel --ungroup --halt now,success=1,fail=1 make ::: consume project run

使用
--ungroup
我可以看到输出,杀戮似乎也像预期的那样工作。与我最初的帖子唯一不同的是,当一个程序结束时,其他程序不会被杀死。但这并不重要。

看这里:。。简言之,您必须存储您创建的孩子的pid,并在脚本接收到SIGINT时杀死他们。如何使用GNU并行运行多个不同的命令?为了简化,假设我需要运行
makeconsumer
makeproject
makerun
。我找不到如何使用parallel来实现这一点。还有什么是并行--halt
--halt
没有列在
parallel--help
上……虽然是出于好意,但从手册页上引用的内容没有接近于解决O.P.问题的方法,实际上没有多大帮助。其他人可能会投反对票。继续发帖,但给出你的经验或解决方案!祝您好运。您可以与
make-j
并行运行make作业
--halt now,success=1,fail=1
不受支持。您可能需要<代码> -现在停止,完成= 1 也考虑使用<代码> --LaySuffux/Cult>而不是<代码> -取消分组< /代码>。这样你就可以保证在每项工作中都能得到满满一行,而且永远不会看到半行的混合。谢谢大家的提示!下周我将试用这些工具。@OleTange
--halt now,done=1
不起作用:
parallel:Error:--halt now后面必须跟成功或失败。