2013-06-22 50 views
0

我有一個簡單的bash腳本中的所有進程運行給定數量的過程:退出,殼牌開始

#!/bin/bash 
# usage: ./run-abt.sh <agent count> <responder port> <publisher port> 
echo "./abt-monitor 127.0.0.1 $2 $3 $1" 
exec ./abt-monitor 127.0.0.1 $2 $3 $1 & 
for ((i=1; i<=$1; i++)) 
do 
    echo "Running agent $i"; 
    exec ./abt-agent 127.0.0.1 $2 $3 $i $1 > $i.txt & 
done 

我需要添加用戶按Ctrl+C和控制返回到bash中,所有的進程創建的時候是通過run-abt.sh來殺死。

+1

注意這不會啓動任何代理:執行腳本的bash進程將由abt-monitor進程*替換,因爲執行命令。 [文檔](http://www.gnu.org/software/bash/manual/bashref.html#index-exec) –

+2

該exec發生在由'&'運算符啓動的子shell中。 – chepner

回答

4

此行添加到您的腳本的開頭:

trap 'kill $(jobs -p)' EXIT 

當腳本接收來自控制-C中斷信號(或任何其它信號,對於這個問題),這將終止所有的孩子進程在退出之前。

在腳本的末尾,添加對wait的調用,以便腳本本身自然退出),然後完成後臺進程,以便上面安裝的信號處理程序有機會運行。也就是,

for ((i=1; i<=$1; i++)) 
do 
    echo "Running agent $i"; 
    exec ./abt-agent 127.0.0.1 $2 $3 $i $1 > $i.txt & 
done  
# There could be more code here. But just before the script would exit naturally,... 
wait   
+0

如何在回答中添加'kill - $$'(這是發信號給整個過程組)? – Samveen

+0

我不確定如何使用負面進程ID來表示與給定進程ID在同一組中的所有進程。它可能特定於Linux附帶的'/ bin/kill'。 – chepner

+0

這是POSIX標準過程信號。 – Samveen

2

使用trap內置:

trap handler_func SIGINT 

你必須存儲和單獨管理的子進程的PID,雖然。

+1

並使用'$!'變量獲取後臺進程的pid。 –