如何在使用 GNU Parallel 的 Bash 脚本中避免 SIGCHLD 错误
How To Avoid SIGCHLD error In Bash Script That Uses GNU Parallel
我在循环中 运行 一个 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 时,我了解到 运行 并行可以创建 "zombie processes",有时,我们需要 "reap" 这些进程。此外,我发现您可以终止进程,因为有时它们会占用所有可用连接。
试图理解:
但是,我一开始并不知道是什么导致了这个问题。是我的相似之处吗?我不是"reaping"进程吗?我应该明确地终止进程吗?是因为我是运行循环中的并行脚本吗?
我的问题:
如何解决 SIGCHLD 错误?
如果您对此有任何经验,我们将不胜感激。
(这只是评论,但评论太长了)。
到目前为止,还没有人能够可靠地重现该错误。看看你能不能做出一个 MCVEhttps://whosebug.com/help/mcve。如果忽略建议解决了问题,那么解决方法应该是将 parallel
中的第 4361 行从:
更改为
delete $SIG{CHLD};
进入:
$SIG{CHLD} = 'IGNORE';
如果有帮助,请告诉我们,如果有效,可以将其放入下一个版本。
我认为这可能是一个并行错误。代码中有一处作者正在删除 sigchld 处理程序,大概是作为忽略信号的一种方式。 perl 文档没有说明可能产生的影响,向我暗示结果将依赖于平台或实现且不可靠。忽略信号的正确方法是将处理程序设置为 "INGORE"。我建议尝试使用版本 20150222,这是一个确实有这个可疑代码的旧版本。
我在循环中 运行 一个 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 时,我了解到 运行 并行可以创建 "zombie processes",有时,我们需要 "reap" 这些进程。此外,我发现您可以终止进程,因为有时它们会占用所有可用连接。
试图理解:
但是,我一开始并不知道是什么导致了这个问题。是我的相似之处吗?我不是"reaping"进程吗?我应该明确地终止进程吗?是因为我是运行循环中的并行脚本吗?
我的问题:
如何解决 SIGCHLD 错误?
如果您对此有任何经验,我们将不胜感激。
(这只是评论,但评论太长了)。
到目前为止,还没有人能够可靠地重现该错误。看看你能不能做出一个 MCVEhttps://whosebug.com/help/mcve。如果忽略建议解决了问题,那么解决方法应该是将 parallel
中的第 4361 行从:
delete $SIG{CHLD};
进入:
$SIG{CHLD} = 'IGNORE';
如果有帮助,请告诉我们,如果有效,可以将其放入下一个版本。
我认为这可能是一个并行错误。代码中有一处作者正在删除 sigchld 处理程序,大概是作为忽略信号的一种方式。 perl 文档没有说明可能产生的影响,向我暗示结果将依赖于平台或实现且不可靠。忽略信号的正确方法是将处理程序设置为 "INGORE"。我建议尝试使用版本 20150222,这是一个确实有这个可疑代码的旧版本。