2012-01-26 21 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本身,并试图杀死它,以后失败。任何想法,为什么这可能是? –