2015-11-22 4 views
3

J'ai un script shell appelé Launcher.sh qui est exécuté par un processus Java. Le processus Java utilise en interne ProcessBuilder pour exécuter le script bash.Comment tuer tous les processus enfants engendrés par un processus démarré à partir d'un script sur kill ou kill -9

A l'intérieur du Launcher.sh, j'ai le code suivant

#!/bin/bash 
trap "kill -- -$$ && kill -INT -$PID" SIGINT SIGTERM SIGKILL 
bash Process_A.sh & 
pid=$! 
echo $pid 

Le script Process_A va engendrer un autre processus enfant appelé Process_B. Je veux tuer à la fois Process_A et Process_B lorsque le script Launcher.sh reçoit une commande "kill" ou une commande "kill -9" de son parent le processus java. J'ai donc ajouté une commande trap pour intercepter les interruptions SIGINT, SIGTERM et SIGKILL. Mais quand je fais

kill $pid 

il ne tue que Process_A mais pas l'enfant Process_B. Les deux ont le même PGID. Comment puis-je tuer correctement tous les processus enfants et petits-enfants issus de mon script launcher.sh?

Voici une sortie réelle de "ps j" avant et après l'arrêt. A l'intérieur de mon script, je fais "dse spark" qui invente un processus java. Je veux que ce processus java à tuer lorsque le script launcer reçoit un signal kill

[email protected]:~# ps j 
PPID PID PGID SID TTY  TPGID STAT UID TIME COMMAND 
2380 2381 2381 2281 pts/1 59265 S  0 0:00 /bin/bash 
    1 58917 58916 1152 pts/0  1236 S  0 0:00 bash /usr/bin/dse spark 
58917 59041 58916 1152 pts/0  1236 Sl  0 0:07 /usr/lib/jvm/java-8-oracle/jre//bin/java -cp /etc/dse/spark/:/usr/share/dse/dse- 
2381 59265 59265 2281 pts/1 59265 R+  0 0:00 ps j 

[email protected]:~# kill 58917 

[email protected]:~# ps j 
PPID PID PGID SID TTY  TPGID STAT UID TIME COMMAND 
1152 1235 1235 1152 pts/0  1236 S  0 0:00 sudo -s 
1235 1236 1236 1152 pts/0  1236 S+  0 0:00 /bin/bash 
    1 59041 58916 1152 pts/0  1236 Sl  0 0:23 /usr/bin/java -cp /etc/dse/spark/:/usr/share/dse/dse- 
2381 59513 59513 2281 pts/1 59513 R+  0 0:00 ps j 

J'ai essayé this..and quand je ne « tue pid » où pid est celle du script. Je reçois une erreur de segmentation car il va à boucle infinie

trap 'echo "Kill All"; kill -TERM -$$' TERM INT 
bash child.sh & 
PID=$! 
wait $PID 
trap - TERM INT 
wait $PID 
EXIT_STATUS=$? 
+0

'SIGKILL' n'est pas trappable (c'est le point de tuer). Sinon, comment pouvez-vous tuer un processus malveillant qui piège 'SIGKILL' et l'ignore? Tuer le groupe à la place. – 4ae1e1

+0

Il est logique que je ne peux pas piéger SIGKILL. Je peux toujours piéger SIGTERM ou SIGINIT? Comment puis-je tuer le groupe de processus lors de la réception de SIGTERM? – user330612

+0

Première question: oui. Deuxième question: 'kill [options] 0',' kill [options] - - $$ ',' kill [options] $ (jobs -p) ', etc – 4ae1e1

Répondre

1

Je dois réinitialiser kill -term dans l'instruction piège pour empêcher la boucle infinie. Cela a fonctionné

piège "piège -INT & & tuer - - $$"