我想编写一个脚本来运行几个不同的无限运行命令,例如在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本身,并试图杀死它,以后失败。任何想法,为什么这可能是? –