1つのファイルに対して「cat」を複数回呼び出す

1つのファイルに対して「cat」を複数回呼び出す

デバイス ファイル 'debug_port' は、あるポートの出力です。3 つのスクリプトがあります:

最初のスクリプトは、ポートからの情報を待機し、同時にログ ファイルにデータを記録し、ログから grep を実行して debug_port にエコーしながら作業を実行します。

#first.sh
pkill cat
cat debug_port > $logfile1 &
running=$!
# perform its tasks...
kill $running
killall -s SIGPIPE cat
pkill -P $$
rm $logfile1

2 番目は他の情報を待機し、別の作業を実行します。

#second.sh
pkill cat
cat debug_port > $logfile2 &
running=$!
# <<< there is problem: no output from 'debug_port'
# perform its tasks...
kill $running
rm $logfile2

そして発信者は両方を順番に呼び出す

#caller.sh
./first.sh
./second.sh

問題は、2 番目のスクリプトに 'debug_port' からの出力がないことです。ただし、何かあるはずです。

答え1

デバイス ファイルを読み取っているとき、シークできない可能性があります。つまり、単一のストリームである可能性があります。その場合、1 つのプロセスからの読み取りによって、別のプロセスによる同じバイトの読み取りが妨げられます。したがって、2 つのプロセスで同時に読み取らないでください。

これを実行する必要があるときは、ストリームをフォークする必要があります。これにより、データをどこかに保存する必要があるため、より多くのメモリ RAM/ディスク (実装によって異なります) が使用される可能性があります。メモリの使用量については、プロセス間のレイアウトによって異なります。

関連情報