在运行以下代码时,我遇到了文件描述符泄漏的问题:
function get_fd_count() {
local fds
cd /proc/$$/fd; fds=( * ) # avoid a StackOverflow source colorizer bug
echo "${#fds[@]}"
}
function fd_leak_func() {
while : ; do
echo ">> Current FDs: $(get_fd_count)"
read retval new_state < <(set +e; new_state=$(echo foo); retval=$?; printf "%d %s\n" $retval $new_state)
done
}
fd_leak_func
已经在3.2.25和4.0.28上进行了测试。
只有在循环发生在函数内部时才会出现这种情况;每次返回到顶层上下文时,额外的文件描述符都会被关闭。
这是预期行为吗?更重要的是,是否有可用的解决方法?
跟进:在报告给bash-bug邮件列表后,确认这是一个错误。Chet表示将在下一个版本中包含修复(截至2010年4月17日)。
true
,它会继续增加,但是放一个/bin/true
就可以保持在 5。 - Ignacio Vazquez-Abramsbashbug
程序将其报告给新闻组,并查看维护者Chet Ramey的反馈意见。 - Dennis Williamson/bin/true
无济于事,但添加(exit 0)
有用。我猜测创建子shell会触发某些清理程序。 - clacke