2016-02-11 4 views
0

У меня есть код, который выглядит как этотФоновый процесс, убивающий его родителя?

function doTheThing{ 
    # a potentially infinite while loop... 
} 
# other stuff... 
doTheThing & 
trap "kill $!" SIGINT SIGTERM 

Как ни странно, когда я Ctrl-C из родительского процесса до того, как цикл закончен, я получаю сообщение о том, что процесс не существует. Кроме того, если я избавлюсь от ловушки, я не могу найти процесс с ps -aF. Похоже, что фоновый процесс убивается, когда его родитель прекращается, но я понял, что этого не должно было случиться. Я просто хочу убедиться, что я могу спокойно оставить в ловушке и не покидать зомби-процессы повсюду.

+1

Control-C убивает всю группу процессов, а не только процесс. – Barmar

+1

Процесс зомби - это процесс, который умер, но его родитель еще не назвал 'wait'. Если родитель убит, зомби получает унаследованный 'init', который ждет его. – Barmar

+0

Чтобы быть ясным, вы говорите, что я не оставлю никаких дополнительных процессов, если я избавлюсь от ловушки? –

ответ

2

POSIX specification говорит, что, когда вы вводите символ прерывания (обычно Control-C) в SIGINT отправляется на переднем плане группы процессов. До тех пор, пока фоновый процесс выполняется в той же группе процессов, что и вызванный им скрипт, он будет получать сигнал одновременно с процессом сценария.

Корпуса обычно используют группы процессов для реализации управления заданиями, и по умолчанию это разрешено только в интерактивных оболочках, а не в сценариях, запускаемых оболочками. Нет стандартного способа запуска функции в собственной группе процессов, но вы можете использовать setsid для запуска ее в новом сеансе, что является еще более высоким уровнем группировки, чем группы процессов. Тогда он не получит прерывание.

Вы все еще можете написать команду trap, которая уничтожает функцию на EXIT.

doTheThing& 
trap "kill $!" EXIT 

Поскольку выход из сценария автоматически не убивает остальную часть группы процессов.

+0

К счастью для меня, это скрипт, который запускает длительный сервер dev. Насколько я знаю, единственными путями завершения сценария являются sigint sigterm и т. Д., Или ошибка segfault/fatal на самом сервере, поэтому я не думаю, что мне нужно беспокоиться –

Смежные вопросы