相关疑难解决方法(0)

Bash脚本在Ctrl + C上杀死背景(大)孩子

我有一个Bash脚本(Bash 3.2,Mac OS X 10.8),它可以并行调用多个Python脚本,以便更好地利用多个内核.每个Python脚本都需要很长时间才能完成.

问题是,如果我在Bash脚本中间按Ctrl + C,Python脚本实际上不会被杀死.如何编写Bash脚本以便杀死它也会杀死所有后台子节点?

这是我原来的"简化测试案例".不幸的是,我似乎已经减少了太多,以至于它不再表现出问题; 我的错.

set -e

cat >work.py <<EOF
import sys, time
for i in range(10):
    time.sleep(1)
    print "Tick from", sys.argv[1]
EOF

function process {
    python ./work.py $1 &
}

process one
process two
wait
Run Code Online (Sandbox Code Playgroud)

这是一个完整的测试用例,仍然大大减少,但希望这个将证明问题.它在我的机器上再现......但是,两天前,我认为我的机器上再现了旧的测试用例,今天它肯定没有.

#!/bin/bash -e
set -x

cat >work.sh <<EOF
for i in 0 1 2 3 4 5 6 7 8 9; do
    sleep 1; echo "still going"
done
EOF
chmod +x work.sh

function kill_all_jobs { jobs -p …
Run Code Online (Sandbox Code Playgroud)

bash shell kill process wait

5
推荐指数
1
解决办法
4455
查看次数

“kill 0”和“kill -?- -$$”有什么区别?

基本上我想要一个 bash 脚本进程在收到 后SIGINT,在退出之前终止其所有子进程。我在这里读到的内容是:

trap "kill -TERM -$$ ; exit 1" INT QUIT
Run Code Online (Sandbox Code Playgroud)

我还阅读了使用kill 0

trap "kill -TERM 0 ; exit 1" INT QUIT
Run Code Online (Sandbox Code Playgroud)

它们之间有什么区别,它们是否满足以下要求(如果不满足,什么要求?)?:

  1. 仅杀死其自身及其子进程(假设它是由终端命令启动的顶级进程)。
  2. 它不会终止同一 shell 脚本的任何其他进程或实例(从单独的终端命令运行:即运行时./foo.sh &,然后,终止./foo.sh第二个进程或实例,即使在同一个 tty 中,终止第二个进程也不应终止第一个进程)。

linux bash shell process process-group

5
推荐指数
1
解决办法
4669
查看次数

标签 统计

bash ×2

process ×2

shell ×2

kill ×1

linux ×1

process-group ×1

wait ×1