(sorry for the previous garbled message, hopefully this one comes out better)Configuration Information [Automatically generated, do not change]:Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-pc-linux-gnu' -DCONF_VENDOR='pc' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash' -DSHELL -DHAVE_CONFIG_H -I. -I../bash -I../bash/include -I../bash/lib -g -O2 -Wall uname output: Linux jpadesk2.mtv.corp.google.com 2.6.32-gg252-generic #gg252-Ubuntu SMP Mon Sep 13 22:09:00 UTC 2010 x86_64 GNU/Linux Machine Type: x86_64-pc-linux-gnu
Bash Version: 4.1 Patch Level: 5 Release Status: release Description: Named pipes are being leaked. The named pipe created for the "echo stuff" in while read x; do echo $x ; done < <(echo stuff) is never closed. Repeat-By: Running the following script. <test_named_pipe_leak.bash4.sh> #!/bin/bash func1() { local arr while read arr; do # The following cmd | cmd causes the leaked named pipe to be cleaned up. [ "$do_workaround" == yes ] && exec | exec # Normally code here would modify some env var. So can't use # "cmd | while read...". done< <(echo hello) echo func1_lsof=$(lsof | grep -c test_name.*pipe) } main() { local do_workaround=$1 local tmpworkdir=/tmp/test_named_pipe_leak.tmp.$$ mkdir -p $tmpworkdir lsof -p $$ > $tmpworkdir/lsof_start for ((i=0; i < 10; i++)); do func1 done lsof -p $$ > $tmpworkdir/lsof_end diff -us $tmpworkdir/lsof_start $tmpworkdir/lsof_end rm -rf $tmpworkdir } main "$@" </test_named_pipe_leak.bash4.sh> Running ~/tmp/test_named_pipe_leak.bash4.sh no outputs <output_txt> func1_lsof=4 func1_lsof=5 func1_lsof=6 func1_lsof=7 func1_lsof=8 func1_lsof=9 func1_lsof=10 func1_lsof=11 func1_lsof=12 func1_lsof=13 --- /home/jpa/tmp/testdir.26477/lsof_start 2010-11-17 13:12:07.904919000 -0800 +++ /home/jpa/tmp/testdir.26477/lsof_end 2010-11-17 13:12:11.280668000 -0800 @@ -22,4 +22,14 @@ test_name 26477 jpa 0u CHR 136,0 0t0 3 /dev/pts/0 test_name 26477 jpa 1u CHR 136,0 0t0 3 /dev/pts/0 test_name 26477 jpa 2u CHR 136,0 0t0 3 /dev/pts/0 +test_name 26477 jpa 54r FIFO 0,8 0t0 5655855 pipe +test_name 26477 jpa 55r FIFO 0,8 0t0 5655740 pipe +test_name 26477 jpa 56r FIFO 0,8 0t0 5655627 pipe +test_name 26477 jpa 57r FIFO 0,8 0t0 5655514 pipe +test_name 26477 jpa 58r FIFO 0,8 0t0 5655401 pipe +test_name 26477 jpa 59r FIFO 0,8 0t0 5655288 pipe +test_name 26477 jpa 60r FIFO 0,8 0t0 5655175 pipe +test_name 26477 jpa 61r FIFO 0,8 0t0 5655051 pipe +test_name 26477 jpa 62r FIFO 0,8 0t0 5654938 pipe +test_name 26477 jpa 63r FIFO 0,8 0t0 5654823 pipe test_name 26477 jpa 255r REG 0,27 712 6002620 /home/jpa/tmp/test_named_pipe_leak.bash4.sh (mtvhome30.nfs:/vol/mtvhome30/jpa) </output_txt> Running ~/tmp/test_named_pipe_leak.bash4.sh yes outputs <output_txt> func1_lsof=3 func1_lsof=3 func1_lsof=3 func1_lsof=3 func1_lsof=3 func1_lsof=3 func1_lsof=3 func1_lsof=3 func1_lsof=3 func1_lsof=3 Files /home/jpa/tmp/testdir.26915/lsof_start and /home/jpa/tmp/testdir.26915/lsof_end are identical </output_txt>