我们注意到 Linux 内核升级后命名管道发生了变化。使用来自http://www.linuxjournal.com/content/using-named-pipes-fifos-bash,我们能够复制该问题。脚本适用于
Linux TEST05 3.13.0-55-generic #94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
但请稍等
Linux TEST01 3.13.0-65-generic #106-Ubuntu SMP Fri Oct 2 22:08:27 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
命名管道的工作方式似乎有所不同。这是有意还是无意的?
我们将这两个脚本捕获为pipe_reader.sh:
#!/bin/bash
pipe=/tmp/testpipe
trap "rm -f $pipe" EXIT
if [[ ! -p $pipe ]]; then
mkfifo $pipe
fi
while true
do
if read line <$pipe; then
if [[ "$line" == 'quit' ]]; then
break
fi
echo $line
fi
done
echo "Reader exiting"
和pipe_writer.sh:
#!/bin/bash
pipe=/tmp/testpipe
if [[ ! -p $pipe ]]; then
echo "Reader not running"
exit 1
fi
if [[ "$1" ]]; then
echo "$1" >$pipe
else
echo "Hello from $$" >$pipe
fi
有解决办法吗?
编辑:
我们在各自的终端中运行每个脚本。它们挂起的意思是写入器脚本永远不存在,而读取器脚本永远不会显示正常的“Hello from...”输出。我们在两个内核版本下以相同的方式执行它们,因此这不是多次运行一个脚本的问题,也不是任何其他程序差异。
答案1
我的声誉不足以写评论,因此以答案的形式写。
你说的挂起是什么意思?在其他终端上pipe_reader.sh
执行后会发生什么?pipe_writer.sh
此外,执行两个脚本之后,命令会做什么:
ls -al /proc/$(pgrep pipe_reader.sh)/fd
展示?
也许你已经运行了多个 .pipe_reader 脚本,所以只有第一个脚本接收了 pipe_writer 输出?确保
ps aux | grep pipe_reader | grep -v grep | wc -l
返回 1
答案2
据我所知,3.13.0-55 和 3.13.0-65 都是同一个内核(3.13),但发行商提供了一些修复/补丁。管道功能不太可能因此次升级而改变。我相信破坏此类功能是内核开发人员所不愿看到的。
还发生了其他事情。