9

У меня есть следующие процессы.

ParentProcess
-- ChildProcess
-- ChildProcess
-- ChildProcess

Как я могу убить только родительский процесс? Я хочу, чтобы процессы детей не были убиты. Если я попытаюсь убить родительский процесс, дети получат SIGHUP и будут убиты.

1 ответ1

8

Вообще говоря, когда процесс становится бесхозным (то есть, его родитель умирает), он принимается init.

Описанная вами особая ситуация, вероятно, применима к интерактивному процессу, когда закрывается его управляющий терминал (из Википедии):

Сигнал SIGHUP отправляется процессу, когда его управляющий терминал закрыт. Первоначально он был разработан, чтобы уведомить процесс сброса последовательной линии. В современных системах этот сигнал обычно означает, что управление псевдо или виртуальным терминалом было закрыто.

Чтобы предотвратить это, дочерние процессы должны блокировать SIGHUP, поэтому в большинстве случаев вам необходимо сотрудничество с родительским процессом.

Если родительский процесс является оболочкой (bash , csh и т. П.) И вы хотите, чтобы команды, которые вы запускаете, не заканчивались после завершения bash, вы можете поставить перед любой командой префикс nohup (из info coreutils "nohup invocation"):

nohup запускает данную КОМАНДУ с игнорируемыми сигналами зависания, так что команда может продолжить работу в фоновом режиме после выхода из системы.

В этом примере:

$ tty
/dev/ttys000
$ nohup find /dir -name file -exec rm {} \;

find не будет уничтожен, когда оболочка завершит работу и закроет управляющий терминал /dev/ttys000 .

Если сценарий оболочки должен блокировать SIGHUP, используйте встроенную trap , как описано здесь для bash .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .