2016-07-14 42 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')。 –