1
我在寫一個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
更有趣 - 就像在我的情況下,運行phantomjs,該過程沒有得到間隔後死亡。
有什麼想法?我錯過了什麼?
當你運行'phantomjs'時,你是用'exec'還是像普通進程一樣運行它?如果你使用'exec',它有什麼區別嗎?這些問題背後的想法是,你殺死運行其他進程的shell(對於'echo「來說,就是shell),但不一定會殺死進程的子進程。也許你需要使用類似'kill -TERM - - $ p'的方式向進程組發送信號,而不僅僅是進程。另外,考慮一下「超時」命令是否會讓你的生活更輕鬆(Linux上的「超時」)。 –
我不知道'timeout'命令 - 我最終使用了這個命令。喬納森,你爲什麼不把這個作爲答案發布,所以我可以接受它? – hackerhasid