2010-04-15 5 views
4

je reçois une fuite de descripteur de fichier lors de l'exécution du code suivant:descripteur de fichier Bash fuite

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 

testé sur 3.2.25 et 4.0.28. Cela ne se produit que lorsque la boucle se produit dans une fonction; chaque fois que nous revenons au contexte de premier niveau, les descripteurs de fichiers supplémentaires sont fermés.

Est-ce un comportement prévu? Plus précisément, des solutions de contournement sont-elles disponibles? Suivi: Après avoir signalé à la liste de diffusion bash-bug, cela a été confirmé comme un bogue. Chet a indiqué qu'un correctif sera inclus dans la prochaine version (en date du 17/04/2010).

+0

Encore plus bizarre, si je mets un 'true' à la fin de la boucle, il continue à monter, mais en mettant un'/bin/true', le niveau reste à 5. –

+0

Report au groupe de discussion en utilisant le programme 'bashbug' et voyez ce que le mainteneur, Chet Ramey, en dit. –

+0

Toujours des fuites dans CentOS 6 bash 4.1.2 (1) -release. – clacke

Répondre

3

Voici un exemple simplifié:

$ fd_leaker() { while :; do read a < <(pwd); c=(/proc/$$/fd/*); c=${#c[@]}; echo $c; done; } 
$ fd_leaker 

Celui-ci est pas fixée à l'aide /bin/true mais il est surtout fixé en utilisant (exit 0) Mais je reçois « bash: echo: erreur d'écriture: appel système Interrupted » erreurs utilisant ce " réparer "ou si j'utilise /bin/pwd au lieu de l'pwd intégré. Il semble également être spécifique à read. J'ai essayé grep . < <(pwd) > /dev/null et cela a fonctionné correctement. Quand j'ai essayé while read a; do :; done < <(pwd)

Les descripteurs de fichiers supplémentaires sous forme de:

lr-x------ 1 user user 64 2010-04-15 19:26 39 -> pipe:[8357879] 

Je ne pense vraiment pas la création d'emballement d'entre eux est destiné, après tout il n'y a rien récursif passe. Je ne vois vraiment pas comment ajouter quelque chose dans la boucle devrait réparer les choses.

2

Mettre un /bin/true à la fin de la boucle le corrige, mais je ne sais pas pourquoi ou comment, ou pourquoi cela arrive en premier lieu.

+0

Je le vois dans les versions 4.0.33 (1) -release, 4.1.0 (1) -release et 3.2.49 (23) -release. Il semble aussi le réparer si je mets un sous-shell '(exit 0)' "no-op" à la fin de la boucle au lieu de '/ bin/true' (qui fonctionne aussi pour moi). –

1

Il semble être corrigé dans bash-4.2. J'ai testé avec bash-4.2.28 en particulier

Questions connexes