我正在尝试编写一个简单的bash脚本。首先,我写了另一个bash脚本,我运行了两个不同程序的5个副本:
#!/bin/bash
./fibonacci1 &
./fibonacci2 &
./fibonacci3 &
./fibonacci4 &
./fibonacci5 &
./factorization1 &
./factorization2 &
./factorization3 &
./factorization4 &
./factorization5 &
程序在无限循环中运行,我想运行它们很长一段时间,即10分钟。我将在我的minix机器上运行它们并收集有关我的调度程序的一些数据。问题是,如何编写一个用SIGINT杀死所有10个程序的bash脚本?
答案 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