2016-07-14 7 views
0

Прежде всего я хотел бы сказать, что я тщательно искал решение моей проблемы в вебе/StackOverflow ..Фоновая функции в сценарии оболочки не убивает

Я имеющий следующий сценарий сценария оболочки :

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

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

Даже после прерывания процесса с помощью Ctrl-C, фоновый процесс по-прежнему печати «работает» в командной строке. Я должен убить фоновый процесс с терминала с помощью «kill -9 PID», где PID - это идентификатор процесса фонового процесса. Я пробовал без & (не работает в фоновом режиме), и скрипт заканчивается с помощью Ctrl-C.

Решение этих проблем предлагается в этих ссылках, однако оно не работает по желанию (фоновый процесс не убивается). я говорил по этим ссылкам:

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

linux: kill background task

+0

я сомневаюсь, что вы можете прервать посланной сценарий, так как он работает до завершения без ожидания, поэтому кажется, что этот скрипт делает n ot представляют ваш реальный сценарий. – 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 builtin 'wait' (попробуйте' help wait' из командной строки). –