2009-10-06 6 views
6

dieses hack.c Programm Gegeben:Bash Trap von TERM - was mache ich falsch?

#include <stdio.h> 
main() 
{ 
int i=0; 
for(i=0; i<100; i++) { 
    printf("%d\n", i); 
    sleep(5); 
} 
} 

und dieses hack.sh Bash-Skript:

#!/bin/bash 
./hack 

Wenn ich hack.sh laufen zwei Prozesse erstellt bekommen - eine für bash, eine für die C Aufgabe. Wenn ein TERM-Signal an den Bash-Prozess gesendet wird, ist der C-Prozess unversehrt.

Angenommen, die ursprüngliche Bash wurde von einem Java-Programm mit Runtime.exec() gestartet, so dass das einzige Steuerelement, über das ich es habe, Process.destroy() ist (was TERM an den Bash-Prozess sendet)? Angenommen, ich möchte den C-Prozess zusammen mit der Bash sterben, die es gestartet?

Ich habe Dinge wie diese in bash versuchen:

#!/bin/bash 
trap "kill -TERM -$$; exit" TERM 
./hack 

das heißt eine Falle Klausel, die das TERM-Signal auffängt und es auf die gesamte Prozessgruppe neu aussendet. Dies funktioniert nicht für mich - ein Bash-Prozess mit dieser Trap-Klausel in ignoriert TERM-Signale.

Was fehlt mir hier?

+1

Die man-Seite von bash sagt: Wenn bash auf den Abschluss eines Befehls wartet und ein Signal empfängt, für das ein Trap gesetzt wurde, wird der Trap erst ausgeführt, wenn der Befehl abgeschlossen ist. – tangens

+0

Haben Sie versucht, 'exec' zu verwenden, anstatt den Shell-Prozess am Leben zu erhalten? –

+0

Sie haben Recht, tangens. Meine einzige Entschuldigung ist, dass der Text im SIGNALS-Bereich liegt, weit über der Trap-Dokumentation. Vielen Dank! –

Antwort

10

Sie könnten etwas in diese Richtung versuchen:

#!/bin/bash 
./hack & 
pid=$! 
trap "kill $pid" TERM 
wait $pid 

Es könnte einfacher sein (und äquivalent), dies zu tun:

#!/bin/bash 
./hack & 
trap "kill $!" TERM 
wait 

Die doppelten Anführungszeichen auf der Falle soll Wort Expansion passieren Wenn der Trap definiert ist, ändert sich der Wert von $! sollte keinen Einfluss haben; aber ich mag die erste Version besser.

+0

Das funktioniert, auch wenn Sie vielleicht denken, dass es nicht aufgrund dessen, was Tangens in den Kommentaren zu der Frage gesagt hat. ABER der komplette Absatz, der teilweise von tangens ausgegeben wird, sagt: – hopla

+0

Wenn bash auf die Ausführung eines Befehls wartet und ein Signal empfängt, für das ein Trap gesetzt wurde, wird der Trap erst ausgeführt, wenn der Befehl abgeschlossen ist. Wenn bash auf einen asynchronen Befehl über den eingebauten Wait wartet, wird der Empfang eines Signals, für das ein Trap gesetzt wurde, bewirken, dass der eingebaute Wait sofort mit einem Exit-Status größer als 128 zurückkehrt, unmittelbar nachdem der Trap ausgeführt wurde. – hopla

+0

Auch möchten Sie hinzufügen, dass Sie die gesamte Prozessgruppe (den Prozess selbst und seine Kinder) töten können, indem Sie Folgendes tun: kill -TERM - $$ – hopla