如何在使用GNU Parallel的Bash脚本中避免SIGCHLD错误

时间:2016-09-28 17:43:38

标签: linux parallel-processing wget gnu-parallel sigchld

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

perform_join(A, B)

循环如下:

Signal SIGCHLD received, but no signal handler set.

导致错误的行看起来像这样(省略选项和设置):

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

研究

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

试图理解:

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

我的问题:

如何解决SIGCHLD错误?

如果您对此有任何经验,我们非常感谢您的见解。

2 个答案:

答案 0 :(得分:1)

我认为这可能是一个并行的错误。代码中有一点是作者正在删除sigchld处理程序,可能是忽略信号的一种方式。 perl文档没有提到可能产生的影响,这表明结果将依赖于平台或实现并且不可靠。忽略信号的正确方法是将处理程序设置为" INGORE"。我建议尝试版本20150222,这是一个旧版本,确实有这个有问题的代码。

答案 1 :(得分:0)

(这只是评论,但评论时间太长了。)

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

    delete $SIG{CHLD};

成:

    $SIG{CHLD} = 'IGNORE';

如果有帮助,请告诉我们,如果有效,可以将其放入下一版本。