如何在很长一段时间后通过bash脚本SIGINT多个后台程序?

时间:2015-01-10 23:17:15

标签: linux bash shell kill sigint

我正在尝试编写一个简单的bash脚本。首先,我写了另一个bash脚本,我运行了两个不同程序的5个副本:

#!/bin/bash
./fibonacci1 &
./fibonacci2 &
./fibonacci3 &
./fibonacci4 &
./fibonacci5 &
./factorization1 &
./factorization2 &
./factorization3 &
./factorization4 &
./factorization5 &

程序在无限循环中运行,我想运行它们很长一段时间,即10分钟。我将在我的minix机器上运行它们并收集有关我的调度程序的一些数据。问题是,如何编写一个用SIGINT杀死所有10个程序的bash脚本?

2 个答案:

答案 0 :(得分:3)

使用数组捕获背景PID:

#!/bin/bash
pids=()
./fibonacci1 &
pids+=( $! )
./fibonacci2 &
pids+=( $! )
./fibonacci3 &
pids+=( $! )
./fibonacci4 &
pids+=( $! )
./fibonacci5 &
pids+=( $! )
./factorization1 &
pids+=( $! )
./factorization2 &
pids+=( $! )
./factorization3 &
pids+=( $! )
./factorization4 &
pids+=( $! )
./factorization5 &
pids+=( $! )

sleep 600
kill -2 "${pids[@]}"

考虑使用循环启动,但由于您运行了10个不同的程序名称,这需要更多的努力(但不是更多的努力):

#!/bin/bash
pids=()
for i in {1..5}
do
    ./fibonacci$i &
    pids+=( $! )
done
for i in {1..5}
do
    ./factorization$i &
    pids+=( $! )
done

sleep 600
kill -2 "${pids[@]}"

答案 1 :(得分:0)

或者你可以使用:

command 1 &
...
command x-1 &
ps > tmp
procs=$(tail -n x tmp | head -n x-1 | cut -d' ' -f2) && rm tmp

sleep 420 && kill -2 $procs

其中x应由命令数+ 1代替。这限制了一些冗余,但如果在第一个和最后一个命令之间调用其他命令(这不应该发生),则可能会造成麻烦。

适用于您的问题:

#!/bin/bash
./fibonacci1 &
./fibonacci2 &
./fibonacci3 &
./fibonacci4 &
./fibonacci5 &
./factorization1 &
./factorization2 &
./factorization3 &
./factorization4 &
./factorization5 &
ps > tmp
procs=$(tail -n 11 tmp | head -n 10 | cut -d' ' -f2) && rm tmp

sleep 420 && kill -2 $procs