У мене такі процеси.
ParentProcess - ChildProcess - ChildProcess - ChildProcess
Як я можу вбити лише батьківський процес? Я хочу, щоб діти не загинули. Якщо я спробую вбити батьківський процес, діти отримають SIGHUP і загинуть.
У мене такі процеси.
ParentProcess - ChildProcess - ChildProcess - ChildProcess
Як я можу вбити лише батьківський процес? Я хочу, щоб діти не загинули. Якщо я спробую вбити батьківський процес, діти отримають SIGHUP і загинуть.
Відповіді:
Взагалі кажучи, коли процес стає сиротою (тобто помирає його батько), він приймається init.
Особлива ситуація, яку ви описуєте, ймовірно, стосується інтерактивного процесу, коли його керуючий термінал закривається (з Вікіпедії ):
Сигнал SIGHUP надсилається процесу, коли його керуючий термінал закритий. Спочатку він був розроблений для повідомлення про падіння послідовної лінії. У сучасних системах цей сигнал зазвичай означає, що керування псевдо або віртуальним терміналом було закрито.
Щоб цього не допустити, дочірні процеси повинні блокувати SIGHUP, тому в більшості випадків вам потрібна співпраця з батьківським процесом.
Якщо батьківський процес оболонки ( bash
, csh
тощо) , і ви хочете команди , які виконуються не закінчується , коли Баш закінчується, ви можете префікс будь-якої команди з nohup
(від info coreutils "nohup invocation"
):
'nohup' запускає дану КОМАНДУ з ігнорованими сигналами відключення, щоб команда могла продовжувати працювати у фоновому режимі після виходу.
У цьому прикладі:
$ tty
/dev/ttys000
$ nohup find /dir -name file -exec rm {} \;
find
не буде вбито, коли оболонка закінчується і закриває керуючий термінал /dev/ttys000
.
Якщо сценарій оболонки повинен блокувати SIGHUP, використовуйте вбудовану команду trap
, як описано тут для bash
.