2017-09-02 63 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」會殺死錯誤的進程。 –