并行:警告:没有更多文件句柄

dwt*_*bar 1 ulimit gnu-parallel

我正在运行 GNU 并行,一段时间后我得到:

parallel: Warning: no more file handles Raising ulimit -n or etc/security/limits.conf may help.
Run Code Online (Sandbox Code Playgroud)

为了克服这个问题,应该向并行命令添加什么参数?

我更改limits.conf为,unlimited但后来我无法使用sudo或登录我的盒子,同样的问题root就像这里ssh

这是我正在使用的代码片段。我有 2 个文件,第一个带有密码,第二个带有主机。

passPasswords_and_hosts() {
        `sudo sshpass -p "$1" ssh -o ConnectTimeout=2 root@"$2" -o StrictHostKeyChecking=no "$command_linux"`
}
export -f testone
export -p command_linux
parallel --tag -k passPasswords_and_hosts :::: "$passwords" "$linux_hosts"
Run Code Online (Sandbox Code Playgroud)

Ole*_*nge 5

为了避免在异常终止(认为或系统崩溃)后留下 tmp 文件kill -9,GNU Parallel 打开 tmp 文件并立即删除它们。但它使文件保持打开状态。

为了满足它的要求,--keep-order必须保持所有尚未打印的文件打开。因此,如果您有 1000000 个命令,并且命令 2 永远卡住,那么 GNU Parallel 将愉快地运行命令 3 及更高版本,但如果命令 2 没有解除卡住,那么 GNU Parallel 最终将耗尽文件句柄(它每个命令使用 4 个文件句柄)。工作)。

在你的情况下,你passPasswords_and_hosts可能会在某个时候陷入困境。在您的输出中,它将是上次输出之后的作业(即尚未打印的作业)。

因此,请尝试手动运行该作业,看看是否存在一些明显的问题。

您也可以删除-k. 然后,您的卡住作业仍将使用 4 个文件句柄,但所有后续完成的作业将不会使用,因为它们将在完成后打印。

最后就可以使用了--timeout。我通常使用--timeout 1000%. 这意味着,如果某个作业花费的时间超过所有成功作业中运行时间的 10 倍,那么它就会被终止。它适用于各种不同的情况。