2009-10-06 19 views
6

Biorąc pod uwagę ten program hack.c:bash trap TERM - co robię źle?

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

i ten hack.sh skryptu bash:

#!/bin/bash 
./hack 

Jeśli biegnę hack.sh dwa procesy uzyskać utworzony - jeden dla bash, jeden dla C zadanie. Jeśli sygnał TERM zostanie wysłany do procesu basha, proces C nie zostanie uszkodzony.

Załóżmy teraz, że oryginalne bash zostało uruchomione z programu Java za pomocą Runtime.exec(), więc jedyną kontrolką, którą mam nad nim jest Process.destroy() (które wysyła TERM do procesu bash)? Załóżmy, że I chce proces C umrzeć wraz z bash, który go uruchomił?

Próbowałem rzeczy jak to w bash:

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

tj klauzuli pułapkę, że łapie sygnał TERM je i przesyła do całej grupy procesów. To nie działa dla mnie - proces bash z tą klauzulą ​​pułapki w nim ignoruje sygnały TERM.

Czego mi tu brakuje?

+1

Strona man basha mówi: Jeśli bash czeka na wykonanie polecenia i odbiera sygnał, dla którego ustawiono pułapkę, pułapka nie zostanie wykonana, dopóki polecenie nie zostanie wykonane. – tangens

+0

Czy próbowałeś używać 'exec' zamiast utrzymywania przy życiu procesu powłoki? –

+0

Masz rację, stwory. Moją jedyną wymówką jest to, że tekst znajduje się w sekcji SYGNAŁY, powyżej dokumentacji pułapki. Dzięki! –

Odpowiedz

10

Można spróbować czegoś wzdłuż tych linii:

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

To może być prostsze (i jego odpowiednik), aby to zrobić:

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

podwójnie cytaty na pułapkę należy dokonać ekspansji słowo stało kiedy pułapka jest zdefiniowana, więc zmienia się wartość $! nie powinien mieć wpływu; ale lubię pierwszą wersję lepiej.

+0

Działa to, nawet jeśli myślisz, że nie dzieje się tak z powodu tego, co mówią stwory w komentarzach do pytania. ALE pełny akapit, częściowo napisany przez tangeny, mówi: – hopla

+0

Jeśli bash czeka na wykonanie polecenia i odbiera sygnał, dla którego ustawiono pułapkę, pułapka nie zostanie wykonana, dopóki polecenie nie zostanie wykonane. Kiedy bash czeka na polecenie asynchroniczne za pośrednictwem wbudowanego wait, odbiór sygnału, dla którego ustawiono pułapkę, spowoduje, że wbudowany wait natychmiast powróci z stanem wyjścia większym niż 128, zaraz po którym zostanie wykonana pułapka. – hopla

+0

Należy również dodać, że można zabić całą grupę procesów (sam proces i jej potomków), wykonując: kill -TERM - $$ – hopla