2016-07-14 43 views
0

首先我想说,我已经彻底搜查解决我的网页/计算器问题..背景功能没有得到杀害

我在下面的shell脚本的场景:

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

procid=$! 
echo $procid 
trap "kill -15 $procid" 2 15 

即使中断与Ctrl-C键的处理之后,后台进程仍然打印“跑”中提示。 我必须使用“kill -9 PID”从终端杀死后台进程,其中PID是后台进程的进程ID。我尝试了没有&(没有在后台运行),脚本用Ctrl-C很好地结束了。

这些问题的解决方案建议在这些链接中,但它不能按需要工作(后台进程没有被杀死)。 我提到这些链接:

How do I kill background processes/jobs when my shell script exits?

linux: kill background task

+0

我怀疑你打断发布脚本,因为它不需要等待就可以完成,所以看起来这个脚本是n代表你的实际情况。 – Armali

回答

0

你需要杀死的全过程组:

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

trap killall EXIT 

# ...launch some child processes... 

wait 

Best way to kill all child processes

+0

我使用上面的代码来杀死后台进程。它在不等待中断的情况下杀死后台函数/代码。 例如,我有一个函数循环,它在父脚本中迭代10个变量的值,稍后在父脚本中调用它并放入后台。即使循环到第二次迭代,它也会很快被打断并被杀死。 –

+0

您必须告诉父进程等待其子进程退出。这通常是使用bash内建的'wait'来完成的(尝试从命令行中'help wait')。 –