我想编写一个脚本,运行几个不同的无限运行命令,例如
run_development_webserver.sh watch_sass_files_and_compile_them.sh watch_coffeescript_files_and_compile_them.sh
我想并行运行它们,并通过击中^ C来杀死他们.这是可能的,如果是这样,我该怎么办?
我会让阿克巴克上将答复这个.
原文链接:https://www.f2er.com/bash/386220.html#!/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
记住,这个不会让固执的过程清理干净,但是如果它需要死亡,那么你可能需要使用它.