2017-09-02 40 views

回答

1

GNU parallel可以做这种工作。检查termination部分,它可以根据退出代码(无论成功或失败关机下剩余的所有进程:

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

当作业的一个成功完成,这将TERM信号发送到其他工作(如果工作不。终止的它会强制使用KILL信号)

+1

谢谢。我已经用GNU并行20130922尝试了这个命令,但是按照您在链接中指示的教程,但是得到:值“now,success = 1”对于选项暂停(预计数字)无效 – baptiste

+0

在版本* 20161222 *(Ubuntu 17.04 default版本)的作品。看起来这种变化是在[2015年期间]引入的(http://git.savannah.gnu.org/cgit/parallel.git/commit/?id=8110572719461a6019b8f4c22d5ebf43f65cfbe6)。尝试使用* - halt -2 *,这似乎是以前的格式。 –

+1

好的,这是有效的。当第一个成功时停止,而不是在第一个失败时停止。然后我在命令结尾处引入了一个错误,我知道它会先完成。 – baptiste

0

wait -n是你在找什么。它等待下一个工作完成。如果您想杀死它们,您可以使用jobs -p列出剩余作业的PID列表。

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

wait -n 

kill "${pids[@]}" 

这需要bash

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

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

0

随着$!你在并行执行的最后一个命令的PID看到一些很好的例子在这里:Bash `wait` command, waiting for more than 1 PID to finish execution

为了您的特殊问题,我想是这样的:

#!/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" 
+0

谢谢。杀死的过程是一个C代码,我想告诉它它将被杀死,并有时间关闭文件。基本上从主控制器发送一个信号到进程中,使其进入一个循环并在被杀死之前进行最后的操作。那可能吗? – baptiste

+0

例如,当完成主设备时,向C文件runMe.c发送一个整数给RunMe 1,以便它进入C代码中的最后一个循环。 – baptiste

+0

我明白你的问题。不幸的是,我还没有提出一个干净的bash解决方案。对于一个干净的解决方案,我们必须关心一些同步,我不知道bash是否真的很方便。例如,在我的示例中,没有针对以下情况的保护:“toKill”过程在“主”过程之前结束。如果在等待“$ pid_master”期间,操作系统启动另一个与前一个“toKill”相同的PID进程,那么bash指令杀死“$ pid_tokill”会杀死错误的进程。 –