2016-07-14 1 views
0

Tout d'abord je voudrais dire que je l'ai bien cherché la solution à mon problème dans web/stackoverflow ..fonction d'arrière-plan dans le script shell ne reçoit pas tué

Je vais avoir le scénario de script shell suivant :

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

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

Même après avoir interrompu le processus avec Ctrl-C, le processus d'arrière-plan continue d'imprimer "en cours d'exécution" dans l'invite. Je dois tuer le processus d'arrière-plan du terminal en utilisant "kill -9 PID", où PID est l'ID de processus du processus d'arrière-plan. J'ai essayé sans le & (pas en arrière-plan) et le script se termine bien avec Ctrl-C.

Les solutions à ce problème sont suggérées dans ces liens, mais cela ne fonctionne pas comme souhaité (le processus d'arrière-plan ne se fait pas tuer). je me suis référé à ces liens:

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

linux: kill background task

+0

Je doute que vous obtenez d'interrompre le posté script, car il se termine sans attendre, il semble donc que ce script ne n ot représenter votre scénario réel. – Armali

Répondre

0

Vous devez tuer l'ensemble du groupe de processus:

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

J'ai utilisé le code ci-dessus pour tuer les processus d'arrière-plan. Il tue la fonction/code d'arrière-plan sans attendre une interruption. Par exemple, j'ai une boucle dans une fonction qui itère pour 10 valeurs d'une variable dans le script parent, que j'appelle plus tard dans le script parent et que je mets en arrière-plan. Il va bientôt être interrompu et tué sans même boucler à la deuxième itération. –

+0

Vous devez indiquer au processus parent d'attendre la sortie de ses enfants. Ceci est typiquement accompli en utilisant le bash intégré dans 'wait' (essayez' help wait' depuis la ligne de commande). –