我想編寫一個腳本來運行幾個不同的無限運行命令,例如在Bash中,我如何運行多個無限運行的命令並用^ C全部取消它們?
run_development_webserver.sh
watch_sass_files_and_compile_them.sh
watch_coffeescript_files_and_compile_them.sh
我想要並行運行它們中的每一個,並通過點擊^ C來殺死它們。這是可能的,如果是這樣,我該怎麼做?
我想編寫一個腳本來運行幾個不同的無限運行命令,例如在Bash中,我如何運行多個無限運行的命令並用^ C全部取消它們?
run_development_webserver.sh
watch_sass_files_and_compile_them.sh
watch_coffeescript_files_and_compile_them.sh
我想要並行運行它們中的每一個,並通過點擊^ C來殺死它們。這是可能的,如果是這樣,我該怎麼做?
我會讓阿德貝爾海軍上將回答這個問題。
#!/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]=$!
),告訴bash
到kill
所有這些(${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
記住,這個人不會讓頑固的過程清理乾淨,但如果它需要死亡而不是,你可能需要使用它。
很好完成.. +1 –
快速,圖像宏,_和_正確的答案? **開始投票。** –
我爲此+1了,因爲這似乎是一般正確的答案。然而,其中一個腳本(實際上啓動memcached不是守護進程模式)似乎會捕獲^ C本身,並試圖殺死它,以後失敗。任何想法,爲什麼這可能是? –