2016-02-26 80 views
0

我正在嘗試創建一個運行多個長命令腳本的bash腳本 - 這些腳本都將以腳本結尾終止。例如:並行運行多個進程但在bash中一起退出

x.sh:

./x.sh [anchored&] 
./x.sh [anchored&] 
./x.sh [anchored&] 

,然後在外殼,應該可以這樣做::

$ ./y.sh 
# after 10 seconds 
10 seconds passed 
10 seconds passed 
10 seconds passed 
# after another 10 seconds 
10 seconds passed 
10 seconds passed 
10 seconds passed 
^[CTRL-C] 
$ # all scripts are now canceled 
爲y.sh

while :; do sleep 10 && echo '10 seconds passed'; done 

pseduo代碼

在我的實際使用情況中,當然,我不是多次運行相同的腳本(x.sh),而是運行不同的命令。

+1

陷阱'SIGTERM'然後發送'SIGTERM'信號到所有後臺進程。 – alvits

+0

我意識到你想要'CTRL-C'。這是'SIGINT'。 – alvits

回答

3

以下是您可以使用的快速解決方案。當按下CTRL-C

#!/bin/bash 
trap terminate SIGINT 
terminate(){ 
    pkill -SIGINT -P $$ 
    exit 
} 
#the rest of your code goes here 
./x.sh & 
./x.sh & 
wait 

trap將執行功能terminate。該函數將在所有進程上執行pkill,其所有進程的父代PID是發送信號SIGINT的腳本的當前PID

腳本末尾的wait可確保腳本在子進程正在運行時保持運行狀態。