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杀死。

4

2 回答 2

4

将此行添加到脚本的开头:

trap 'kill $(jobs -p)' EXIT

当您的脚本收到来自 Control-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         
于 2013-06-22T23:07:22.470 回答
2

使用trap内置:

trap handler_func SIGINT

但是,您必须分别存储和管理子进程的 pid。

于 2013-06-22T21:04:30.783 回答