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

标签 linux bash shell kill sigint

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

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

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

最佳答案

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

关于linux - 长时间后如何通过 bash 脚本 SIGINT 多个后台程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27882204/

相关文章:

linux - grep 打印以 '(' 开头、包含 'specific substring' 、以 ')' 结尾的所有字符串(不是行)

linux - 在 Shell 脚本中声明数组时出错

linux - 在 bash 脚本中,如何将文本文件中包含的值提供给程序执行的开关?

c++ - 串行通信 : 0x0D is replaced by 0x0A during transmission

linux - RELP 是否存在于 RSYSLOG 协议(protocol)之外?

c - setuid 和 seteuid 函数

linux - 在当前目录和子目录中查找文件类型,包括隐藏文件。 (家庭作业)

bash - 传递变量时正确使用 curl --data-urlencode

Bash,没有取消的 Zenity 进度条

python - 使用 python 获取 Shell 输出