【问题标题】:Checking and killing hanged background processes in a bash script在 bash 脚本中检查和杀死挂起的后台进程
【发布时间】:2015-09-10 15:20:31
【问题描述】:

假设我在 bash 中有这个伪代码

#!/bin/bash

things    
for i in {1..3}
do
    nohup someScript[i] &

done
wait

for i in {4..6}
do
    nohup someScript[i] &

done
wait
otherThings

说这个 someScript[i] 有时会挂起。

有没有办法获取进程 ID(使用 $!) 并定期检查进程是否花费了超过指定的时间,之后我想用 kill -9 杀死挂起的进程?

【问题讨论】:

  • 您可以为您触发的每个进程创建一个看门狗。要实现看门狗进程,您可以使用time -o run.${!}.time nohup someScript[i] 运行主进程,并在启动主进程后将它们作为后台进程运行。看门狗应该评估time 命令存储的统计信息。另一种可能更简单的方法是在您启动脚本进程时将时间戳存储在一个数组中,并检查后台进程数组和(当前)时间戳数组的每个映射以及在等待命令之前启动的免费进程。

标签: bash process wait kill pid


【解决方案1】:

不幸的是,@Eugeniu 的回答对我不起作用,超时出错了。

但是我发现执行此例程很有用,我将在此处发布,以便任何人在遇到相同问题时都可以利用它。

创建另一个类似这样的脚本

#!/bin/bash
#monitor.sh

pid=$1

counter=10
while ps -p $pid > /dev/null
do
    if [[ $counter -eq 0 ]] ; then
            kill -9 $pid
    #if it's still there then kill it
    fi
    counter=$((counter-1))
    sleep 1
done

然后在你刚刚放入的主要工作中

things    
for i in {1..3}
do
    nohup someScript[i] &
    ./monitor.sh $! &
done
wait

通过这种方式,对于您的任何 someScript,您将拥有一个并行进程,该进程检查它是否在每个选定的时间间隔(直到由计数器决定的最大时间)仍然存在,并且如果相关进程死亡(或被杀死),它实际上会自行退出

【讨论】:

  • 那么,在monitor.sh 中,对于以nohup 开始的每个作业,您将超时设置为10 秒?
  • 你可以控制它,每个进程允许的最长时间是*,而进程每秒检查一次。
  • 我没有发现 monitor.sh 中的 while 循环与这 3 个命令之间的区别:pid=$1; sleep <time-in-s>; kill -9 $pid
  • 不确定我是否理解您的疑问,但我会尝试更清楚:只有当进程处于活动状态时,while 条件 ps -p $pid 才为真。因此,只要该过程自行结束,这种情况就不再成立,monitor.sh 也会结束。如果进程挂起,while 循环将持续到 * 秒,此时计数器达到 0 并且进程被监视器杀死(退出监视器本身,因为 while 条件现在为假)
【解决方案2】:

一种可能的方法:

#!/bin/bash

# things
mypids=()
for i in {1..3}; do
    # launch the script with timeout (3600s)
    timeout 3600 nohup someScript[i] &
    mypids[i]=$! # store the PID
done

wait "${mypids[@]}"

【讨论】:

  • 我实际上需要那个“等待”命令来避免填满服务器容量。每个进程都需要 8 个处理器中的一个,这就是为什么我要等待 3 个进程结束后再触发其他进程。这样,你将如何集成等待命令?抱歉,我现在看到等待命令放错了位置。
  • @MarcoPietrosanto 首先检查来自第一个进程的所有 pid,然后在它们全部结束/杀死时继续执行脚本。
  • @MarcoPietrosanto: wait 只会阻止脚本的执行,直到所有进程完成。因此,您需要先休眠一段时间,然后检查是否有任何进程还活着,然后杀死那些活着的进程,然后继续。
  • 它们通常会在几分钟内结束(变量),然后等待以适当的方式捕获它。在继续“无论发生什么”之前睡固定的时间不是我需要的。我需要一些东西: - 如果进程按照它们必须的方式运行,则无需等待固定的时间即可继续运行 - 如果进程挂起(超过一个小时或类似的时间),那么它会杀死它。
  • @Marco Pietrosanto:检查更新的答案。还可以从here 发布的答案中获得启发。
猜你喜欢
  • 2012-09-30
  • 1970-01-01
  • 2016-01-24
  • 2014-05-18
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
相关资源
最近更新 更多