我有一个困难的时间写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
)。