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

How to SIGINT multiple background programs via bash script after a long time?

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

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

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

使用数组捕获后台 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[@]}"

或者您可以使用:

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