我們注意到 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
命名管道的工作方式似乎有所不同。這是有意還是無意?
我們將這兩個腳本捕獲為 pipeline_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"
和 pipeline_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 腳本,因此只有第一個腳本接收到 pipeline_writer 輸出?確保
ps aux | grep pipe_reader | grep -v grep | wc -l
返回 1
答案2
據我了解,3.13.0-55 和 3.13.0-65 都是相同的核心 (3.13),並由發行提供者提供了一些修復/補丁。此次升級不太可能改變管道功能。我相信破壞此類功能會引起核心開發人員的不滿。
還有其他事情正在發生。