【问题标题】:How to SIGINT multiple background programs via bash script after a long time?长时间后如何通过bash脚本对多个后台程序进行SIGINT?
【发布时间】:2015-01-10 23:17:15
【问题描述】:

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

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

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

【问题讨论】:

  • 您也可以使用 timeout 内置命令启动命令。例如,timeout 10s sleep 420 将启动命令 sleep 420,如果 10 秒后它仍在运行,则将其终止。

标签: linux bash shell kill sigint


【解决方案1】:

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

【讨论】:

  • 感谢您的回答,但我无法运行您的代码,第 2 行似乎有错误:语法错误:“(”意外
  • 您是使用bash 还是使用sh 运行它。如果您使用sh,它可能不起作用,并且可能会给出您提到的错误。
  • 哦,我的错,你是对的,使用 bash -x foo.sh 运行解决了这个问题。非常感谢!
  • 很抱歉再次打扰您,它在我的 Ubuntu 机器上有效,但在我的 Minix 机器上无效。它为第二个代码给出了以下错误:第 6 行:语法错误:单词意外(期望“)”)有什么想法吗?
  • 不确定,因为我没有使用过 Minix。从表面上看,这意味着您的 Minix 系统上的外壳不是现代 Bash(“现代”的意思是“从这个千年开始,而不是最后一个千年”)。奇怪的是它是第 6 行。如果您使用循环脚本,那就是 += 行;如果是内联代码,则几乎无法解释(因为第 6 行是第二行 +=,如果出现错误,则应该在第一行,而不是第二行)。再次,仔细查看您实际使用的外壳。您可能需要运行 bash --version 和/或 sh --version 来查看是什么。
【解决方案2】:

您也可以使用:

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

【讨论】:

  • kill -9 正在发送 SIGKILL,而不是 SIGINT。这也很残酷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2013-10-14
  • 2012-07-25
相关资源
最近更新 更多