1

我在编写 bash 脚本时遇到了困难,希望有人能提供帮助。基本上我试图同时运行多个进程,然后在一段时间后将它们全部杀死。

例如,如果我想跑my_long_running_task50 次并在 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 添加到数组中。然后最后只睡一段时间,然后遍历数组并杀死所有的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 更有趣的事情时,进程不会在间隔后被杀死。

有什么想法吗?我错过了什么?

4

1 回答 1

0

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

  • 当你运行时phantomjs,你运行它exec还是作为一个正常进程运行?
  • 如果你使用它有什么不同exec吗?

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

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

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

此外,请考虑“超时”命令是否会让您的生活更轻松(timeout在 Linux 上)。

于 2014-07-02T18:59:08.397 回答