我正在做一项项目,并且我想为我找到的解决方案做出贡献:
代码是这样的:
while true
do
while read VAR
do
......
done < <(find ........ | sort)
sleep 3
done
日志中的错误如下:
/dir/script.bin: redirection error: cannot duplicate fd: Too many open files
/dir/script.bin: cannot make pipe for process substitution: Too many open files
/dir/script.bin: line 26: <(find "${DIRVAR}" -type f -name '*.pdf' | sort): Too many open files
find: `/somedirtofind': Too many open files
/dir/script.bin: cannot make pipe for process substitution: Too many open files
/dir/script.bin: cannot make pipe for process substitution: Too many open files
/dir/script.bin: line 26: <(find "${DIRVAR}" -type f -name '*.pdf' | sort): ambiguous redirect
我发现使用命令:
ls -l /proc/3657(这里填写pid)/fd
可以查看文件描述符不断增加的情况。这是在Debian 7、GNU bash版本为4.2.37(1)-release (i486-pc-linux-gnu)的环境下观察到的。
while...done < <(foo)
的原因之一是因为foo
在新进程中执行,但循环体将在当前进程中执行,因此循环体可以与其他代码共享变量。而使用foo | while ...done
,foo
在当前进程中,而循环体在新进程中,因此循环体写入的任何变量都不会在其他地方可见。切换哪个部分在哪个进程中执行可能会解释为什么文件描述符被清理或未被清理(当子进程退出时)。 - Warbo