我正在循环运行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并行的专家,但脚本似乎大部分时间工作正常,除非我得到上述错误。 在查看SIGCHLD时,我了解到并行可以创build“僵尸进程”,有时我们需要“收获”这些进程。 此外,我发现你可以杀死进程,因为有时他们可以占用所有可用的连接。
试图理解:
但是,我不知道是什么原因造成的问题。 这是我的平行吗? 我不是“收获”过程吗? 我应该明确杀死进程吗? 是因为我在一个循环中运行一个并行脚本?
我的问题:
我该如何解决SIGCHLD错误?
如果你有这方面的经验,非常感谢你的洞察力。
我认为这可能是一个并行的错误。 代码中有一点是作者正在删除sigchld处理程序,可能是忽略信号的一种方式。 perl文档没有说明会产生什么效果,这就暗示了结果将是平台或实现的依赖和不可靠。 忽略信号的正确方法是将处理程序设置为“INGORE”。 我建议尝试版本20150222,这个有问题的代码的旧版本。
(这只是一个评论,但太长的评论)。
到目前为止,没有人能够可靠地重现错误。 看看你是否可以创建一个MCVE https://stackoverflow.com/help/mcve 。 如果IGNORE建议解决了这个问题,那么修复应该是从以下行parallel
改变4361 parallel
:
delete $SIG{CHLD};
成:
$SIG{CHLD} = 'IGNORE';
让我们知道如果有帮助,所以它可以被放入下一个版本,如果它的工作。