Bash文件:并行运行进程,并在进程结束时停止

Bash文件:并行运行进程,并在进程结束时停止,bash,Bash,我想从一个bash文件并行启动两个C代码,第二个代码在第一个文件完成后停止。 指令wait期望两个进程都停止,这不是我想要做的。 谢谢你的建议。等等-n就是你要找的。它等待下一个作业完成。然后,如果要杀死剩余作业,可以使用jobs-p创建剩余作业的PID列表 prog1 & pids=( $! ) prog2 & pids+=( $! ) wait -n kill "${pids[@]}" 这需要bash 这两个程序作为后台作业启动,shell等待其中一个退出 发生这种情况

我想从一个bash文件并行启动两个C代码,第二个代码在第一个文件完成后停止。 指令wait期望两个进程都停止,这不是我想要做的。
谢谢你的建议。

等等-n
就是你要找的。它等待下一个作业完成。然后,如果要杀死剩余作业,可以使用
jobs-p
创建剩余作业的PID列表

prog1 & pids=( $! )
prog2 & pids+=( $! )

wait -n

kill "${pids[@]}"
这需要
bash

这两个程序作为后台作业启动,shell等待其中一个退出

发生这种情况时,
kill
用于终止这两个进程(这将导致错误,因为其中一个进程已经死了)。

可以执行这种工作。选中部分,它可以根据退出代码关闭其余进程(成功或失败:

parallel -j2 --halt now,success=1 ::: 'cmd1 args' 'cmd2 args'

当其中一个作业成功完成时,它将向其他作业发送TERM信号(如果作业未终止,它将使用KILL信号强制)。

使用
$!
可以获得并行执行的最后一个命令的pid。请参阅此处的一些示例:

对于你的特殊问题,我设想如下:

#!/bin/bash

command_master() {
    echo -e "Command_master"
    sleep 1
}
command_tokill() {
    echo -e "Command_tokill"
    sleep 10
}

command_master & pid_master=($!)
command_tokill & pid_tokill=($!)
wait "$pid_master"
kill "$pid_tokill"

您想如何停止第二个命令?使用“kill”?谢谢。我已经用GNU parallel 20130922尝试过这个命令,但是按照您在链接中指出的教程,但是在版本20161222(Ubuntu 17.04默认版本)中,get:Value“now,success=1”对于选项halt(预期数量)无效行得通。似乎是引入了更改。尝试使用--halt-2,这似乎是以前的格式。好的,这是行得通的。它不是在第一个成功时停止,而是在第一个失败时停止。然后我在命令末尾引入了一个错误,我知道它将首先完成。如果你认为这个答案回答了你的问题,妈妈将其视为已接受。这样,它将从未回答问题列表中删除。更多内容:谢谢。终止进程是一个C代码,我想告诉您,它将被终止,并且之前有时间关闭文件。基本上,从主进程向进程发送终止信号,以便它进入循环并在终止之前执行最终操作killed。这可能吗?例如,当主程序完成时,将一个整数发送到C文件runMe.C和runMe 1,这样它就进入C代码中的最后一个循环。我理解您的问题。不幸的是,我没有一个干净的bash解决方案可供提出。要想得到一个干净的解决方案,必须注意一些同步,我不知道bash是否是reall很方便。例如,在我的示例中,没有针对以下情况的保护:“toKill”进程在“master”进程之前结束。如果在等待“$pid\u master”期间,操作系统启动另一个与前一个“toKill”进程具有相同pid的进程,那么bash指令kill“$pid\u toKill”将终止错误的进程。这是不太可能的,因为AFAIK on*nix PID是以增量方式生成的(一旦达到限制,分配将在零处重新启动,然后再次增加,跳过仍然存在的PID)。但解决方案不干净。。。。