当ctrl + c停止时,如何停止所有prog从bash-script并行运行

时间:2011-12-05 11:27:58

标签: bash

#! /bin/bash
make clean
make
port_number=8888
(./s $port_number) & 
(./c 127.0.0.1 $port_number) &
(./c 127.0.0.1 $port_number) &

s和c是简单的tcp服务器和客户端。当客户端完成所有操作并停止服务器仍在运行但是当我停止脚本时,Ctrl + C服务器仍然在内存中,我需要手动杀死它。如何用脚本杀死它?

加入:

从接受的答案中捕获+使用等待使其发挥作用的好处。

工作过:

#! /bin/bash

make clean
make
port_number=8888
(./s $port_number) &
s_pid=$!
(./c 127.0.0.1 $port_number) &
(./c 127.0.0.1 $port_number) &

trap "{ kill -SIGKILL $s_pid ; exit 0; }" SIGINT
wait

2 个答案:

答案 0 :(得分:2)

尝试保存过程的pids:

#! /bin/bash
make clean
make
port_number=8888
./s $port_number & 
s_pid=$!
./c 127.0.0.1 $port_number &
./c 127.0.0.1 $port_number &

并捕获SIGINT信号(应该在脚本的末尾)

trap "{ kill -SIGKILL $s_pid ; exit 0; }" SIGINT

你可以将pid保存到文件并参数化脚本,这样你就可以说

$ actions start

$ actions stop

类似

#! /bin/bash
pidfile="server.pid"

start_it(){
  echo "Starting ..."
  make clean
  make
  port_number=8888
  (./s $port_number) & 
  # write pid-file
  echo $! > $pidfile
  (./c 127.0.0.1 $port_number) &
  (./c 127.0.0.1 $port_number) &
}

stop_it(){
  read -r pid < $pidfile
  kill $pid
  echo "Stopped."
}

case "$1" in
  start)
  start_it
  exit 0
  ;;
  stop)
  stop_it
  exit 0
  ;;
esac

exit 0

..如果这不是太多了:)

答案 1 :(得分:0)

像这样,例如:

kill $(jobs -p)