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

#php #mysql #pear #pcntl

#php #mysql #pear #pcntl

Вопрос:

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

Итак, демон разветвляет кучу процессов, затем разветвляет другую кучу процессов

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

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

 while(true)
{
SQL QUERY EXECUTED

   while(mysql_fetch_array)
   {
       Fork children
   }
}
  

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

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

Комментарии:

1. Я просмотрел этот вопрос из-за названия. Просто говорю

2. И сам вопрос не разочаровал: «Я хочу настроить демон, который разветвляет кучу процессов». Разве это не фильм Романа Полански?

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

4. хороший дробовик не может помочь ни с чем: P

5. Вы можете сделать это с помощью fire.

Ответ №1:

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

 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
  

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

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

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

Ответ №2:

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

Комментарии:

1. проблема в том, что я имею дело с информацией, чувствительной ко времени. Родительский процесс-демон проверяет базу данных на наличие события, которое должно произойти в определенное время, разветвляет дочерние процессы для обработки события, а затем возвращается для проверки в другой раз, чтобы увидеть, есть ли какие-либо другие события, которые должны произойти в это время. Итак, вы видите, родительский процесс должен продолжать работать. Есть ли более эффективный способ добиться этого?

2. @Pota Onasys, почему вы не используете процессы вместо форков?

3. @Pota Onasys, это должно сработать. Вам больше не нужно было бы беспокоиться о зомби.

4. Вам всегда нужно беспокоиться о зомби.

Ответ №3:

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