连续运行分叉进程,间隔后终止



我有一个困难的时间写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专家,但这似乎应该工作- fork所有进程添加他们的pid到一个数组。最后,在迭代数组并杀死所有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更有趣的事情时,比如,在我的情况下,运行phantomjs,进程不会在间隔后被杀死。

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

你的愿望就是我的命令(至少,当你的愿望与我的愿望充分一致时):

  • 当你运行phantomjs,你运行它与exec或只是作为一个正常的进程?
  • 使用exec有什么区别吗?

问题背后的想法是,您杀死了运行另一个进程的shell(在echo的情况下,它是shell),但这并不一定会杀死该进程的子进程。也许你需要使用如下命令:

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

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

另外,考虑一个'time out'命令是否会使您的工作更轻松(Linux上的timeout)。

最新更新