运行以下代码时出现文件描述符泄漏:
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日)。
答案 0 :(得分:3)
这是一个简化的例子:
$ fd_leaker() { while :; do read a < <(pwd); c=(/proc/$$/fd/*); c=${#c[@]}; echo $c; done; }
$ fd_leaker
使用/bin/true
并没有解决这个问题,但是它主要通过使用(exit 0)
来修复但是我得到了“bash:echo:写错误:系统调用中断”错误使用“修复”或者如果我使用/bin/pwd
代替内置pwd
。
它似乎也特定于read
。我试过grep . < <(pwd) > /dev/null
并且它运行正常。当我尝试while read a; do :; done < <( pwd)
以下形式的额外文件描述符:
lr-x------ 1 user user 64 2010-04-15 19:26 39 -> pipe:[8357879]
我真的不认为它们的失控创造是有意的,毕竟没有任何递归发生。我真的不知道在循环中添加一些内容应该如何解决问题。
答案 1 :(得分:2)
在循环结束处放置/bin/true
会修复它,但我不知道为什么或如何,或者为什么它首先发生。
答案 2 :(得分:1)
似乎在bash-4.2中修复了。我用bash-4.2.28进行了测试,特别是