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
名前付きパイプの動作に違いがあるようです。これは意図的なものでしょうか?
次の 2 つのスクリプトを 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 つのスクリプトを複数回実行したり、その他の手順の違いが問題になることはありません。
答え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) ですが、ディストリビューション プロバイダーによっていくつかの修正/パッチが適用されています。このアップグレードでパイプ機能が変更される可能性は低いでしょう。そのような機能を破壊することはカーネル開発者に嫌われると思います。
何か別のことが起こっています。