gpt4 book ai didi

Perl:fork(),避免僵尸进程,和 "No child processes"错误

转载 作者:行者123 更新时间:2023-12-02 00:50:59 24 4
gpt4 key购买 nike

我有一个 Perl 应用程序,它在 RH 系统上运行了几年,基本没有问题。在一个地方,我必须运行一个可能需要很多分钟才能完成的系统命令,所以我在子进程中执行此操作。整体结构是这样的:

    $SIG{CHLD} = 'IGNORE'; # Ignore dead children, to avoid zombie processes
my $child = fork();

if ($child) { # Parent; return OK
$self->status_ok();
} else { # Child; run system command
# do a bunch of data retrieval, etc.
my $output;
my @command = # generate system command here
use IPC::System::Simple 'capture';
eval { $output = capture(@command); };
$self->log->error("Error running @command: $@") if $@;
# success: log $output, carry on
}

我们最近更改了一些基础架构,尽管不是以我预期的方式对此产生任何影响。 (仍在RH上运行,仍在使用nginx等)但是,现在我们发现几乎每个运行这段代码的实例都失败了,记录'Error running {command}: failed to start: "No child processes"at/path/to/code.pl'.

我环顾四周,无法找出正确的解决方案。有人建议将 $SIG{CHLD} 从“IGNORE”更改为“DEFAULT”,但我不得不担心僵尸进程。

是什么导致了“无子进程”错误,我们该如何解决?

最佳答案

There was a suggestion to change $SIG{CHLD} from 'IGNORE' to 'DEFAULT', but then I have to worry about zombie processes.

这不是真的。

僵尸进程是一个已经结束但还没有被其父进程回收的进程。父进程使用 wait(2)、waitpid(2) 或类似的方式获取其子进程。 capture 等待它的 child 结束,所以它不会留下任何僵尸。

事实上,您收到的错误来自waitpidcapture 正在等待子进程结束以获取它并收集其错误代码,但是您指示操作系统在它完成后立即清理子进程,留下 waitpid没有 child 可以收获,也没有错误代码可以收集。

要解决此问题,只需在调用 capture 之前放置 local $SIG{CHLD} = 'DEFAULT';

关于Perl:fork(),避免僵尸进程,和 "No child processes"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57679883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com