在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将它们全部杀死(${PIDS [*])您的脚本获取SIGINT信号(Ctrl C),然后等待所有进程退出.

我会主动提到“kill ${PIDS [*]}”在创建陷阱时扩展PIDS;如果您将双引号(“)更改为单引号(‘),则在陷阱执行时将会扩展,这意味着您可以在设置陷阱后将其添加到PIDS中,并将它们杀死.

如果您有一个顽固的进程不想在Ctrl C(SIGINT)后退出,您可能需要发送一个更强大的杀伤信号 – SIGTERM或甚至SIGKILL(使用此作为最后的手段,它无条件地杀死进程,而不会给它机会清理).首先,尝试将陷阱线更改为:

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

如果它不响应SIGTERM,请分别保存该进程的pid,在STUBBORN_PID中说明,并使用:

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

记住,这个不会让固执的过程清理干净,但是如果它需要死亡,那么你可能需要使用它.

相关文章
相关标签/搜索