加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读