/ / Bashfalle von TERM - was mache ich falsch? - Bash, Signale, Term, Bash-Trap

Bash Trap von TERM - was mache ich falsch? - Bash, Signale, Term, Bash-Trap

Angesichts dieses Hack.c-Programms:

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

und dieses Hack.sh-Bash-Skript:

#!/bin/bash
./hack

Wenn ich hack.sh starte, werden zwei Prozesse erstellt - einer für bash, einer für die C-Task. Wenn ein TERM-Signal an den Bash-Prozess gesendet wird, ist der C-Prozess unversehrt.

Nehmen wir nun an, dass die Original-Bash von einem Java-Programm mit Runtime.exec () gestartet wurde, so dass das einzige Steuerelement, das ich dafür habe, Process.destroy () ist (welches TERM an den Bash-Prozess sendet)? Angenommen, ich wollen der C-Prozess, um zusammen mit der Bash zu sterben, die ihn gestartet hat?

Ich habe solche Dinge in bash probiert:

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

eine Trap-Klausel, die das TERM-Signal abfängt und es erneut an die gesamte Prozessgruppe sendet. Das funktioniert nicht für mich - ein Bash-Prozess mit dieser Trap-Klausel ignoriert TERM-Signale.

Was fehlt mir hier?

Antworten:

10 für die Antwort № 1

Sie könnten etwas in dieser Richtung versuchen:

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

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

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

Die doppelten Anführungszeichen in der Trap sollten die Worterweiterung ermöglichen, wenn die Trap definiert ist, also ein sich ändernder Wert von $! sollte keinen Einfluss haben, aber ich mag die erste Version besser.