Баш-ловушка TERM - что я делаю не так? - PullRequest
6 голосов
/ 06 октября 2009

Учитывая эту программу hack.c:

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

и этот bash-скрипт hack.sh:

#!/bin/bash
./hack

Если я запускаю hack.sh, создаются два процесса - один для bash, другой для задачи C. Если в процесс bash отправляется сигнал TERM, процесс C не пострадал.

Теперь предположим, что исходный bash был запущен из Java-программы с использованием Runtime.exec (), поэтому единственный элемент управления, который у меня есть, это Process.destroy () (который отправляет TERM процессу bash)? Предположим, я хочу , чтобы процесс C умер вместе с bash, который его запустил?

Я пробовал такие вещи в bash:

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

т.е. предложение trap, которое ловит сигнал TERM и ретранслирует его всей группе процессов. Это не работает для меня - процесс bash с этим условием trap игнорирует TERM сигналы.

Что мне здесь не хватает?

1 Ответ

10 голосов
/ 06 октября 2009

Вы можете попробовать что-то вроде этого:

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

Это может быть проще (и эквивалентно) сделать это:

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

Двойные кавычки на ловушке должны приводить к расширению слова, когда ловушка определена, поэтому изменяющееся значение $! не должно иметь влияния; но мне больше нравится первая версия.

...