2013-06-22 106 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。 –