连续运行分叉过程,间隔后杀死

时间:2014-07-02 00:26:03

标签: bash process kill subshell

我很难写一个bash脚本,希望有人可以提供帮助。基本上我试图同时运行多个进程,然后在一段时间后将它们全部杀掉。

所以,例如,如果我想运行my_long_running_task 50次并在10分钟后杀死这就是我想出的:

#!/bin/bash
PIDS=()

(while :
do
  my_long_running_task;
  sleep 1
done ) &
PIDS+=($!)

...{repeat while loop 50 times or stick it in a for loop)...

sleep 600; # 10 minutes * 60 seconds
for p in "${PIDS[@]}"
do
  kill $p
done

我不是bash专家,但似乎它应该可行 - 将所有进程添加到数组中。然后在最后只是睡眠一段时间,然后迭代阵列并杀死所有的pid。事实上这对我非常简单的poc起作用了:

#!/bin/bash
PIDS=()

(while :
  do
    echo '1'
    sleep 1;
  done) &
PIDS+=($!)

(while :
  do
    echo '2'
    sleep 1;
  done) &
PIDS+=($!)

(sleep 10; \
for p in "${PIDS[@]}"
do
  kill $p
done)

但是当我做一些比echo更有趣的事情 - 就像在我的情况下运行幻影一样,这些过程在间隔之后不会被杀死。

任何想法?我错过了什么?

1 个答案:

答案 0 :(得分:0)

你的愿望是我的命令(至少,当你的愿望符合我的愿望时):

  
      
  • 当您运行phantomjs时,是使用exec运行还是仅作为正常流程运行?
  •   
  • 如果您使用exec
  • ,会有什么不同吗?   
     

问题背后的想法是你杀死了运行另一个进程的shell(在echo的情况下是shell),但这并不一定会杀死那些处理。也许你需要使用类似的东西:

kill -TERM -- -$p
kill -- -$p
     

向进程组发送信号,而不仅仅是进程。

     

另外,考虑是否超时'命令会让你的生活更轻松(在Linux上timeout)。