在Bash中,如何运行多个无限运行的命令,并用^ C取消它们?
发布时间:2020-12-15 18:44:59 所属栏目:安全 来源:网络整理
导读:我想编写一个脚本,运行几个不同的无限运行命令,例如 run_development_webserver.shwatch_sass_files_and_compile_them.shwatch_coffeescript_files_and_compile_them.sh 我想并行运行它们,并通过击中^ 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 记住,这个不会让固执的过程清理干净,但是如果它需要死亡,那么你可能需要使用它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |