#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
.