Parallel :: ForkManager离开了最后一个孩子的僵尸进程

时间:2013-05-28 19:41:54

标签: 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($inputcon);

    $pm->finish();
}

当我在这个脚本上做wgets时,一切正常,我看到进程列表中的子进程,但是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>

你知道,最后一个孩子的过程总是一个僵尸。 不知道为什么所有进程都正常工作,但最后一步没有。

任何提示,解决方案?

谢谢。

//对不起我的英文


以下是示例代码。 在127:8080上的一个wget使得孩子的过程是一个僵尸。 但脚本正在运行,新查询/新僵尸PID。

#!/usr/bin/perl

use HTTP::Daemon;
use Parallel::ForkManager;

$daemon = new HTTP::Daemon(LocalPort => 8080, LocalAddr => "127.0.0.1", Listen => 64, ReuseAddr => 1) or die "$!";

$pm = Parallel::ForkManager->new(3);

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

    $pm->start and next; 

    do_client_stuff($inputcon);

    $pm->finish();
}

sub do_client_stuff
{
    my ($inputcon) = @_;

    $request = $inputcon->get_request;

    print $request . "\n";

    $inputcon->send_error(403);
 }

3 个答案:

答案 0 :(得分:2)

你错过了

$pm->wait_all_children;

答案 1 :(得分:2)

可以使用以下代码修复:

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

答案 2 :(得分:1)

也许你应该让你的孩子进入睡眠状态一段时间?我与僵尸有类似的问题,但在我的情况下,它是文件读取,所以孩子们的工作速度比下一行文件读取速度快,让他们睡觉解决了僵尸问题。