2014-07-02 75 views
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,該過程沒有得到間隔後死亡。

有什麼想法?我錯過了什麼?

+2

當你運行'phantomjs'時,你是用'exec'還是像普通進程一樣運行它?如果你使用'exec',它有什麼區別嗎?這些問題背後的想法是,你殺死運行其他進程的shell(對於'echo「來說,就是shell),但不一定會殺死進程的子進程。也許你需要使用類似'kill -TERM - - $ p'的方式向進程組發送信號,而不僅僅是進程。另外,考慮一下「超時」命令是否會讓你的生活更輕鬆(Linux上的「超時」)。 –

+0

我不知道'timeout'命令 - 我最終使用了這個命令。喬納森,你爲什麼不把這個作爲答案發布,所以我可以接受它? – hackerhasid

回答

0

你的願望就是我的命令(至少,當您想與我的願望充分對齊):

  • 當您運行phantomjs,你跟exec或者只是作爲一個正常的進程運行呢?
  • 如果您使用exec,它有什麼區別嗎?

問題背後的想法是,你殺了運行其他程序(其中,在echo的情況下,是shell)的外殼,但是,這並不一定殺進程的孩子。也許你需要使用類似的東西:

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

向過程組發送信號,而不僅僅是過程。

此外,請考慮'超時'命令是否會讓您的生活更輕鬆(Linux上的timeout)。