4

我正在循环运行 script.sh。该脚本包含一个并行的 wget 命令。我收到以下错误:

Signal SIGCHLD received, but no signal handler set.

循环如下所示:

for i in {1..5}; do /script.sh; done

导致错误的行如下所示(省略选项和设置):

cat file.txt | parallel -j15 wget

研究:

我不是 GNU Parallel 的专家,但脚本似乎在大多数情况下都可以正常工作,除非我收到上述错误。在查找 SIGCHLD 时,我了解到并行运行会创建“僵尸进程”,有时,我们需要“收获”这些进程。另外,我发现您可以杀死进程,因为有时它们可​​以占用所有可用的连接。

试图理解:

但是,我首先不知道是什么导致了这个问题。是我的相似之处吗?我不是在“收获”过程吗?我应该明确地杀死进程吗?是因为我在循环中运行并行脚本吗?

我的问题:

如何解决 SIGCHLD 错误?

如果您对此有任何经验,我们将不胜感激您的洞察力。

4

2 回答 2

1

我认为这可能是一个并行的错误。代码中有一点作者正在删除 sigchld 处理程序,大概是作为一种忽略信号的方式。perl 文档对可能产生的影响保持沉默,向我暗示结果将取决于平台或实现且不可靠。忽略信号的正确方法是将处理程序设置为“INGORE”。我建议尝试版本 20150222,这是一个旧版本,它确实有这个有问题的代码。

于 2016-09-30T09:10:54.920 回答
0

(这只是一个评论,但评论太长了)。

到目前为止,没有人能够可靠地重现该错误。看看你是否可以制作一个 MCVE https://stackoverflow.com/help/mcve。如果 IGNORE 建议解决了问题,那么修复应该是更改第 4361 行parallel

    delete $SIG{CHLD};

进入:

    $SIG{CHLD} = 'IGNORE';

让我们知道这是否有帮助,因此如果有效,可以将其放入下一个版本。

于 2016-09-29T06:35:47.390 回答