Есть некий скрипт, который постоянно «форкает» себя, потомки делают небольшое дело и умирают как подобает.
Все вроде как работает хорошо, но при запуске более 32 000 форков (это стандартный лимит # cat /proc/sys/kernel/pid_max), Debian обрезает процессу репродуктивную функцию, не дает процессу возможностей больше запускать что либо (не важно, будет это форк или процесс, вообще не чего запустить нельзя).
Собственно вопрос, как сделать, что бы все было правильно?
Так проблема в том, что когда количество созданных потомков превышает max_pid, система не дает больше запускать, не одновременно запущенные, а вообще все которые были запущенны.
Возможно потомки как то не верно умирают, из за этого система думает кто они еще живы.
И самой главное не забыть, что после завершения потомка нужно уменьшить счётчик:
/** Перехватываем системные сигналы **/
declare(ticks=1);
if(function_exists('pcntl_signal_dispatch')) //PHP 5.3
register_tick_function('pcntl_signal_dispatch');
// Ждем сообщения от потомков о завершении работы
pcntl_signal(SIGCHLD, "childSignalHandler");
function childSignalHandler($signo, $pid = null, $status = null) {
global $forkCount;
switch($signo) {
case SIGCHLD:
// При получении сигнала от дочернего процесса
if (!$pid) {
$pid = pcntl_waitpid(-1, $status, WNOHANG);
}
// Пока есть завершенные дочерние процессы
while ($pid > 0) {
$forkCount--;
$pid = pcntl_waitpid(-1, $status, WNOHANG);
}
break;
default:
// все остальные сигналы
}
}