убийство детей-зомби в родительских процессах

Итак, я хочу сделать следующее:
Настроить демон, который разветвляет кучу процессов.

Таким образом, демон разветвляет группу процессов, а затем разветвляет другую группу процессов.

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

Родительский процесс (демон) делает что-то вроде этого:

while(true)
{
SQL QUERY EXECUTED

   while(mysql_fetch_array)
   {
       Fork children
   }
}

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

Я использую функцию PEAR системного демона для создания демона и функцию pcntl_fork для создания процессов.


person Community    schedule 10.11.2011    source источник
comment
Я просмотрел этот вопрос из-за названия. Просто говорю'   -  person Derek Stobbe    schedule 11.11.2011
comment
И сам вопрос не разочаровал: я хочу настроить демон, который разветвляет кучу процессов. Разве это не фильм Романа Полански?   -  person sdleihssirhc    schedule 11.11.2011
comment
@Problematic, терминология UNIX о процессах довольно жуткая. Я имею в виду, что демон-родитель действительно должен приложить все усилия, чтобы убить своих детей, чтобы они не стали зомби. Вы действительно не хотите, чтобы зомби бегали по системе только потому, что родитель не смог убить своих собственных детей...   -  person rid    schedule 11.11.2011
comment
Ни с чем хороший дробовик не может помочь :P   -  person mugetsu    schedule 11.11.2011
comment
Вы можете сделать это с помощью огня.   -  person Hyangelo    schedule 11.11.2011
comment
Следует добавить функцию doubleTap() к вашему демону, не хочу, чтобы эти зомби возвращались.   -  person Mike Purcell    schedule 11.11.2011
comment
@PontaOnasys Это шутка. Мы все ужасные люди, хихикающие над убийством детей-зомби.   -  person Ben Brocka    schedule 11.11.2011
comment
@BenBrocka: Мое предложение на самом деле можно назвать doubleFork() и оно заботится о зомби :)   -  person ypercubeᵀᴹ    schedule 11.11.2011


Ответы (3)


Не помню, где я это видел:

Parent forks child
  Waits until child is dead  (this won't take long, see ahead)
  Goes on

Child does only 2 things:
  Forks a grandchild
  Exits

Grandchild does whatever work is needed
  Exits

Хитрость в том, что когда Внук умирает, его родитель (один из ваших Детей) уже мертв. Но кто-то должен быть уведомлен о смерти. Похоже, что в системах Linux уведомляется не прародитель, а пра-пра-...-прародитель всех. И поскольку этот процесс знает свою работу, он периодически проверяет мертвых детей и не позволяет им стать зомби.

Вот ссылка с объяснением: http://fixunix.com/unix/533215-how-avoid-zombie-processes.html

Когда родитель процесса завершается, процесс «init» становится его родителем. Таким образом, когда дочерний процесс завершается, дочерний процесс теряет своего родителя и принимается процессом init. Init всегда пожинает мертвых потомков, поэтому они не становятся зомби.

person ypercubeᵀᴹ    schedule 10.11.2011

Вы должны подумать о том, чтобы родитель ничего не делал, кроме как ждал детей. Если родитель по какой-либо причине умрет, то дети станут зомби. Однако, если родитель ничего не делает, то вероятность того, что он неожиданно умрет, очень мала.

person rid    schedule 10.11.2011
comment
проблема в том, что я имею дело с чувствительной ко времени информацией. Родительский процесс-демон проверяет базу данных на наличие события, которое должно произойти в определенное время, разветвляет дочерние процессы для обработки события, а затем возвращается, чтобы проверить еще раз, чтобы увидеть, есть ли какие-либо другие события, которые должны произойти в это время. время. Итак, вы видите, что родительский процесс должен продолжать работать. Есть ли более эффективный способ добиться этого? - person ; 11.11.2011
comment
@Pota Onasys, почему бы тебе не использовать процессы вместо форков? - person rid; 11.11.2011
comment
@Pota Onasys, это должно сработать. Вам больше не нужно беспокоиться о зомби. - person rid; 11.11.2011
comment
Вы всегда должны заботиться о зомби. - person Derek Stobbe; 11.11.2011

Если вы явно установите для обработчика SIGCHLD значение SIG_IGN (вместо SIG_DFL), это предотвратит превращение ваших дочерних процессов в зомби-процессы, если вас не интересуют их коды выхода. В качестве альтернативы в более новых Linux вы должны вместо этого использовать флаг sigaction SA_NOCLDWAIT.

person Neil    schedule 10.11.2011