我正在循环运行 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 错误?
如果您有这方面的经验,我们非常感谢您的见解。
我认为这可能是一个并行的错误。代码中有一点,作者正在删除 sigchld 处理程序,大概是作为忽略信号的一种方式。 Perl 文档没有提及可能产生的影响,这表明结果将取决于平台或实现且不可靠。忽略信号的正确方法是将处理程序设置为“INGORE”。我建议尝试版本 20150222,这是一个旧版本,确实有这个有问题的代码。
到目前为止,还没有人能够可靠地重现该错误。如果 IGNORE 建议解决了问题,那么解决方法应该是将
parallel
中的第 4361 行从: 更改为
delete $SIG{CHLD};
进入:
$SIG{CHLD} = 'IGNORE';