Зомби не единственная возможная причина этой проблемы - о остановленных детях может не сообщаться по разным причинам.
Существование зомби обычно означает, что родитель не ожидал их должным образом.Тем не менее, опубликованный код выглядит нормально, поэтому, если где-то не скрывается ошибка фреймворка, я бы хотел выйти за рамки апокалипсиса зомби, чтобы объяснить эту проблему.
В отличие от зомби, которых нельзя полностью пожать, потому чтоу них нет доступного родителя, замороженные процессы имеют неповрежденного родителя, но перестали отвечать по какой-то причине (ожидание внешнего процесса или операции ввода-вывода, проблемы с памятью, длительный или бесконечный цикл, медленные операции с базой данных и т. д..).
На некоторых платформах Ruby может добавить флаг, запрашивающий возврат остановленных дочерних элементов, о которых не было сообщено, используя следующий синтаксис:
waitpid(pid, Process::WUNTRACED)
AFAIK waitall
didn 'у него нет версии, которая принимает флаги, поэтому вам придется объединять ее самостоятельно или использовать pid = -1
для ожидания любого дочернего процесса (по умолчанию, если вы опустите pid) или pid = 0
для ожидания любого дочернего процесса с тем же процессомgroupID как вызывающий процесс.
См. документацию здесь .