Perl Parallel::ForkManager从最后一个子级留下一个僵尸进程

Perl Parallel::ForkManager从最后一个子级留下一个僵尸进程,perl,parallel-processing,fork,zombie-process,Perl,Parallel Processing,Fork,Zombie Process,我已经找到了前一个问题的解决方案,但还有一个 但对于这个,我还没有找到任何解决办法 守则: [...] use HTTP::Daemon use Parallel::ForkManager; PM with , for example 3 processes MAX [...] while (1) { $inputcon = $daemon->accept(); $pm->start and next; #fork do_client_stuff($i

我已经找到了前一个问题的解决方案,但还有一个

但对于这个,我还没有找到任何解决办法

守则:

[...]
use HTTP::Daemon
use Parallel::ForkManager;

PM with , for example 3 processes MAX
[...]

while (1)
{
    $inputcon = $daemon->accept();

    $pm->start and next; #fork

    do_client_stuff($inputcon);

    $pm->finish();
}
当我在这个脚本上执行wgets时,一切都正常,我在进程列表上看到了子进程,但是last(总是last)有问题

最后一个子进程始终保持僵尸状态。 当我再执行一个wget时,这个僵尸进程将正常退出,而另一个(来自当前wget查询的这个)将变成僵尸

5989 pts/5    S+     0:00      \_ grep test.pl
5975 pts/4    S+     0:00      \_ /usr/bin/perl ./test.pl
5987 pts/4    Z+     0:00          \_ [test.pl] <defunct>
你失踪了

$pm->wait_all_children;

也许你应该让你的孩子睡一会儿?我对僵尸也有类似的问题,但在我的例子中是文件读取,所以孩子们的工作速度比读取下一行文件快,让他们睡觉解决了僵尸问题

可通过使用以下代码进行修复:

my $pm = Parallel::ForkManager->new(3);
$SIG{CHLD} = sub{  Parallel::ForkManager::wait_children($pm) };

我有这个,但这是在一段时间之后,所以当我“轻轻”终止进程时,它会起作用,我是否应该将它添加到内部某个位置?不,
finish
将根据需要在循环内部收获。正如您所见,这不起作用。最后一个总是我的意思是开始,而不是结束。我已经解释了如何收获这个过程。你丢失了
$pm->等等所有的孩子
my $pm = Parallel::ForkManager->new(3);
$SIG{CHLD} = sub{  Parallel::ForkManager::wait_children($pm) };