Bash shell脚本中的后台函数未被终止

Bash shell脚本中的后台函数未被终止,bash,background-process,kill,Bash,Background Process,Kill,首先,我想说的是,我已经彻底搜索了web/stackoverflow中问题的解决方案 我有以下shell脚本场景: #!/bin/bash { while : do echo "running" sleep 2 done }& procid=$! echo $procid trap "kill -15 $procid" 2 15 即使在用Ctrl-C中断进程之后,后台进程仍然在提示符中打印“running”。 我必须使用“ki

首先,我想说的是,我已经彻底搜索了web/stackoverflow中问题的解决方案

我有以下shell脚本场景:

#!/bin/bash
{
    while :
    do
        echo "running"
        sleep 2
    done
}&

procid=$!
echo $procid
trap "kill -15 $procid" 2 15 
即使在用Ctrl-C中断进程之后,后台进程仍然在提示符中打印“running”。 我必须使用“kill-9PID”从终端终止后台进程,其中PID是后台进程的进程ID。我在没有&(没有在后台运行)的情况下进行了尝试,并且使用Ctrl-C可以很好地终止脚本

这些链接中建议了此类问题的解决方案,但是它没有按预期工作(后台进程没有被终止)。 我提到这些链接:


您需要终止整个进程组:

killall () {
    PID=$$
    kill -9 -$(ps -o pgid= $PID | grep -o '[0-9]*')
}

trap killall EXIT

# ...launch some child processes...

wait

您需要终止整个进程组:

killall () {
    PID=$$
    kill -9 -$(ps -o pgid= $PID | grep -o '[0-9]*')
}

trap killall EXIT

# ...launch some child processes...

wait

我使用上述代码终止后台进程。它在不等待中断的情况下终止后台函数/代码。例如,我在一个函数中有一个循环,它在父脚本中迭代一个变量的10个值,稍后我在父脚本中调用它并将其放在后台。它很快就会被中断和终止,甚至不会循环到第二次迭代。您必须告诉父进程等待其子进程退出。这通常是使用bash内置的
wait
(从命令行尝试
help wait
)完成的。它在不等待中断的情况下终止后台函数/代码。例如,我在一个函数中有一个循环,它在父脚本中迭代一个变量的10个值,稍后我在父脚本中调用它并将其放在后台。它很快就会被中断和终止,甚至不会循环到第二次迭代。您必须告诉父进程等待其子进程退出。这通常是使用bash内置的
wait
(从命令行尝试
help wait
)来完成的。我怀疑您是否能够中断发布的脚本,因为它可以在不等待的情况下运行到完成,所以此脚本似乎不代表您的实际场景。我怀疑您是否能够中断发布的脚本,因为它不需要等待就可以运行到完成,所以这个脚本似乎并不代表您的实际场景。