2012-01-26 26 views

回答

34

我會讓阿德貝爾海軍上將回答這個問題。

trap

#!/bin/bash -e 

run_development_webserver.sh & 
PIDS[0]=$! 
watch_sass_files_and_compile_them.sh & 
PIDS[1]=$! 
watch_coffeescript_files_and_compile_them.sh & 
PIDS[2]=$! 

trap "kill ${PIDS[*]}" SIGINT 

wait 

這將啓動您的每一個命令在後臺(&),把他們的進程ID($!)到一個數組(PIDS[x]=$!),告訴bashkill所有這些(${PIDS[*])當你的腳本獲取SIGINT信號(Ctrl + C),然後wait s退出所有進程。

我會主動提到"kill ${PIDS[*]}"擴大PIDS當你創建trap;如果您將雙引號(")更改爲單引號('),則會在執行trap時將其展開,這意味着您可以在設置trap後將更多進程添加到PIDS,並且它也會將它們殺死。

如果您有不想要按Ctrl +ÇSIGINT)後退出倔強的過程中,你可能需要把它更強的終止信號 - SIGTERM甚至SIGKILL(以此爲最後的手段,它無條件地殺死這個過程,而沒有給它一個清理的機會)。首先,嘗試改變trap行這樣的:

trap "kill -TERM ${PIDS[*]}" SIGINT 

如果它不給SIGTERM迴應,保存進程的PID分開,說在STUBBORN_PID,並使用此:

trap "kill ${PIDS[*]}; kill -KILL $STUBBORN_PID" SIGINT 

記住,這個人不會讓頑固的過程清理乾淨,但如果它需要死亡而不是,你可能需要使用它。

+0

很好完成.. +1 –

+3

快速,圖像宏,_和_正確的答案? **開始投票。** –

+0

我爲此+1了,因爲這似乎是一般正確的答案。然而,其中一個腳本(實際上啓動memcached不是守護進程模式)似乎會捕獲^ C本身,並試圖殺死它,以後失敗。任何想法,爲什麼這可能是? –